使用 Omnipay Wechatpay 在 WordPress 中增加微信支付-原生二维码支付方法

文 / @UTHEME

微信支付在WordPress中的应用

随着微信支付的不断普及,越来越多的人想在WordPress网站中增加微信支付功能。然而,由于微信官方SDK复杂难用,很多开发者面对它时望而却步。幸好,有一款名为Omnipay-wechatpay的第三方支付网关,由PHP大牛lokielse开发。本文将介绍如何在WordPress中使用Omnipay-wechatpay实现微信原生二维码支付。

安装OmnipayWechatpay

使用Composer安装OmnipayWechatpay。如果不熟悉Composer,可以先了解一下本站之前的文章《在WordPress主题或插件中使用phpComposer》。安装完成后,配置微信支付网关:

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;
}

虽然这个函数也可以不写,直接在需要使用微信支付的地方创建支付网关也是可以的。但是,如果我们需要在多处用到支付网关,封装一个函数可以减少代码重复,也更方便配置和调试。

生成二维码

将订单数据提交给微信支付网关,生成二维码。这一步涉及一个叫做WordPress Dispatcher库的自定义URL生成器,具体实现方法可参考本站之前的文章《使用WordPress Dispatcher创建自定义URL》。为了调用方便,也可以使用自定义页面模板或WordPress AJAX API来创建URL。

new Dispatch([
  'wechat_charge' => function($request){
    $total_fee = trim($_GET['mount']);
    $tn = order_no(); //订单号生成函数,需自行替换

    $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');

    //使用EndroidQrCode库生成二维码图片并输出到浏览器
    $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还支持支付宝和银联支付网关,支付宝支付网关的使用方法可以参考本站之前的文章《在WordPress中使用Omnipay-Alipay实现支付宝支付》。银联支付网关的使用方法也类似,有机会测试了再单独介绍。

添加UTHEME为好友
扫码添加UTHEME微信为好友
· 分享WordPress相关技术文章,主题上新与优惠动态早知道。
· 微信端最大WordPress社群,限时免费入群。