微信支付越来越流行了,很有赶超支付宝的兆头,很多朋友想在 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 实现支付宝支付 中已经介绍过了,银联支付网关的使用方法也大同小异,等以后有机会测试了,再另外发文章介绍。