微信支付越来越流行了,很有赶超支付宝的兆头,很多朋友想在 WordPress 网站中增加微信支付功能,可是微信官方的 SDK 非常难用,光看文档就令很多想使用微信支付的开发者望而却步了。万幸我们有 Omnipay,Omnipay-wechatpay 是 Omnipay 的一个第三方支付网关,由 PHP 大牛 lokielse 开发,我们今天来简单介绍一下怎么使用 Omnipay-wechatpay 在 WordPress 中增加微信原生二维码支付。
首先,通过 Composer 安装 Omnipay Wechatpay
如果不知道怎么使用 Composer,建议先看一下本站之前的文章在WordPress主题或插件中使用php Composer。如果你已经配置好 Composer 了,直接运行下面的命令,Composer 就会自动帮你安装 omnipay-wechatpay。
composer require lokielse/omnipay-wechatpay
安装完成后,我们来配置一下微信支付网关:
require_once( dirname( __FILE__ ) . '/../vendor/autoload.php' );
use Omnipay\Omnipay;
// 获取微信支付网关的函数
function get_wechat_gateway() {
$gateway = Omnipay::create('WechatPay_Native');
$gateway->setAppId('xxxxxxxxxx'); 微信 APPid
$gateway->setMchId('xxxxxxxxxxxxx'); 微信商户 ID
$gateway->setApiKey('xxxxxxxxxxxxxxxx'); 微信支付 key
return $gateway;
}
其实这个函数也可以用不写,直接在需要使用微信支付的地方创建支付网关也可以,但是我们需要在多处用到支付网关,把创建支付网关的代码封装在一个函数里可以减少重复代码,也更方便配置和调试。
第二步,提供订单数据,生成二维码
这一步所做的操作就是把订单数据提交给微信支付网关,然后根据微信网关返回的信息生成二维码。用户使用微信扫描二维码即可支付订单。
这一步和第三步中使用的生成自定义 URL 的方法使用的是 WordPress Dispatcher 库,当然,你也可以使用自定义页面模板或者 WordPress AJAX API 创建URL。
new Dispatch( [
'wechat_charge' => function ( $request ) {
$total_fee = trim( $_GET[ 'mount' ] );
$tn = order_no(); //这里的 order_on() 是生成订单号的函数,请用自己的函数代替
$params = [
'out_trade_no' => $tn,
'notify_url' => 'http://www.wpzhiku.com/wechat_return/', //支付成功后接受通知的 URL
'body' => '在线充值',
'total_fee' => $total_fee * 100, //微信的单位是0.01,乘以100才是实际的订单金额
'spbill_create_ip' => '127.0.0.1',
'fee_type' => 'CNY',
];
// 在真实的使用环境中,我们应该在这一步把订单数据保存到数据库,以便保留订单记录,在支付成功后更新订单状态。
$gateway = get_wechat_gateway();
$response = $gateway->purchase( $params )->send();
$code_url = $response->getCodeUrl();
ob_start();
header('Content-Type: image/png');
// 输入生成的二维码到浏览器,这里用到了Endroid QrCode 库来生成二维码,也可以使用其他的库代替
$qrCode = new Endroid\QrCode\QrCode();
$qrCode->setText( $code_url )
->setSize( 128 )
->setPadding( 0 )
->render();
$qr_output = ob_get_clean();
echo $qr_output;
exit;
},
] );
第三步,根据微信网关通知,处理订单
这一步主要做的就是判断订单状态,然后更新订单信息,由于我们上一步没有保存订单数据到数据库,这里就不具体说明怎么操作了,根据你的使用场景和业务逻辑进行判断就可以了。
new Dispatch( [
'wechat_return' => function ( $request ) {
$gateway = get_wechat_gateway();
$response = $gateway->completePurchase([
'request_params' => file_get_contents('php://input')
])->send();
if ( $response->isPaid() ) {
echo '支付成功';
// $data是一个PHP 数组,数组的内容就是支付成功后返回来的数据
$data = $response->getRequestData();
$out_trade_no = $data['out_trade_no'];
} else {
echo '支付失败';
}
},
] );
Omnipay 除了 omnipay-wechatpay 这个微信支付网关,还有支付宝和银联支付网关,支付宝支付网关的使用方法在本站之前的文章:在 WordPress 中使用 Omnipay-Alipay 实现支付宝支付 中已经介绍过了,银联支付网关的使用方法也大同小异,等以后有机会测试了,再另外发文章介绍。
关于 "使用 Omnipay Wechatpay 在 WordPress 中增加微信支付-原生二维码支付方法 "的一个想法
非常实用。。