對於呼叫微信支付,微信提供了 JS SDK 來幫助我們實現在微信裡面呼叫微信支付的功能。以下是具體的實現步驟,
第一步、安裝實現微信支付所需的包
我們依然使用Omnipay Wechat Pay這個包來幫助我們實現微信支付,其實和之前的原生掃碼支付方式是類似的,只不過使用的介面不同罷了。下面是我開發的微信網站中使用的函式庫。其中前兩者不用說了,很明顯是微信支付所用的 Omnipay 庫,Wordpress Dispatcher 是一個 WordPress Router 系統,用來實現自訂 URL,Valitron 主要用來驗證用戶提交資料。
"require": { "omnipay/omnipay": "~2.0", "lokielse/omnipay-wechatpay": "^1.0", "thefold/wordpress-dispatcher": "^1.0", "vlucas/valitron": "^1.2", },
執行composer install指令安裝完成後,在主題或外掛程式中引入自動載入檔案。
require_once( get_template_directory() . '/vendor/autoload.php' );
前端實作:設定微信JS SDK,並實作微信支付
這裡的jssdk.php 是微信官方提供的,用來實作為初始化微信JS SDK提供簽名包。在需要實作微信支付的頁面引入這個文件,然後初始化 JSSDK 類別即可。
require_once( get_template_directory() . '/inc/jssdk.php' ); $jssdk = new JSSDK( "xxxxx", "xxxxxxxxxxxxxxxx" ); $signPackage = $jssdk->GetSignPackage();
初始化微信JS sdk, 呼叫微信支付方法實作微信支付
首先、確保在頁面的head 因為了微信JS SDK 的JavaScript 檔案:jweixin-1.0 .0.js。根據上面取得的 $signPackage,我們在下面程式碼中完成了以下幾個操作。
使用 wx.config 初始化 js sdk使用 wx.ready 偵測 js sdk 是否初始化成功,如果初始化成功,我們就可以使用微信 js sdk 提供的介面進行操作了。點選付款按鈕時,發送一個 Ajax 請求到伺服器,取得微信訂單,然後使用 wx.chooseWXPay 發起微信支付,就是我們在微信裡面看到的彈出輸入微信密碼的介面。
jQuery(document).ready(function ($) { // 配置 js sdk wx.config({ debug: false, appId: '<?php echo $signPackage[ "appId" ];?>', timestamp: <?php echo $signPackage[ "timestamp" ];?>, nonceStr: '<?php echo $signPackage[ "nonceStr" ];?>', signature: '<?php echo $signPackage[ "signature" ];?>', jsApiList: ['chooseWXPay'] // 这里的 jsApiList 需要什么就填写什么 }); // 一定要检查 js sdk 是否已经准备好了 wx.ready(function () { $("#topay").click(function () { $.ajax({ url: '/order/', type: 'POST', dataType: 'json', data: $("#wepay").serialize(), success: function (order) { var params = { 'timestamp': order.timeStamp, 'nonceStr': order.nonceStr, 'package': order.package, 'signType': order.signType, 'paySign': order.paySign }; wx.chooseWXPay(params); }, error: function (order) { c-alert(order.message); } }); return false; }); });});
支付窗口閃一下消失有以下幾種情況
在微信上測試微信支付的時候,經常會遇到微信支付窗口閃一下就消失了,看不到輸入支付密碼的介面,可能的原因有以下幾點,仔細檢查一下。
jssdk 沒有配置,檢查上面程式碼中的wx.config 和 wx.readyAjax 回傳的資料有錯誤,檢查Ajax 請求的回傳資料安全網域設定錯誤,檢查在微信管理後台中,是否把測試網域加入到了安全域名中
後端實作:驗證並發送訂單資料
#後端實作很簡單,就是接收上面Ajax 提交過來的數據,然後處理微信支付所需的Json 數據,同時保存訂單到站點的資料庫中,以供後續查詢和後面的通知回調中使用。
// 获取微信支付网关的函数function get_wechat_gateway() { $gateway = Omnipay::create( 'WechatPay_Js' ); $gateway->setAppId( ' xxxxxxxx' ); $gateway->setMchId( 'xxxxxxxx' ); $gateway->setApiKey( 'xxxxxxxx' ); //注意这里的 ApiKey 是我们在微信商户后台设置的一个32位的随机字符串,和微信公众号里面的 App Secrit 不是一回事。 return $gateway;}/** * 处理订单信息, 跳转到微信支付 */new Dispatch( [ 'wepay/order' => function ( $request ) { // 检查用户提交的数据是否有错,如果有错误,返回错误信息 $v = new Validator( $_POST ); $v->rule( 'required', [ 'count', 'buyer_name', 'buyer_phone', 'buyer_address' ] ); if ( ! $v->validate() ) { $msg = [ 'success' => '0', 'message' => '下单失败, 请检查所有必填项。', ]; wp_send_json( $msg ); } $user = wp_get_current_user(); $req = Request::createFromGlobals(); $pid = $req->get( 'pid' ); $count = $req->get( 'count' ); $open_id = $req->cookies->get( 'open_id' ); $prod = get_post( $pid ); $price = get_post_meta( $pid, '_prod_price', true ); $total_fee = $price * $count * 100; $tn = date( 'YmdHis' ) . mt_rand( 1000, 9999 ); // 在实际开发过程中,我们需要把用户提交的订单数据保存到数据库一份 // 订单参数 $order = [ 'body' => $prod->post_title', 'out_trade_no' => $tn, 'total_fee' => $total_fee, 'spbill_create_ip' => wizhi_get_real_ip(), 'fee_type' => 'CNY', 'open_id' => $open_id, ]; // 发送支付请求到微信并获取返回信息 $gateway = get_wechat_gateway(); $gateway->setNotifyUrl( 'https://www.wpzhiku.com/order/return' ); $response = $gateway->purchase( $order )->send(); $wechat_return = $response->getJsOrderData(); wp_send_json( $wechat_return ); },] );
接受微信支付成功通知,實現自動完成訂單或自動充值
支付完成後,微信會返回一個支付成功的通知到我們提供的通知URL,我們可以根據返回的內容,進行自動完成訂單或自動儲值等操作。這裡有兩點要注意。
通知 URL 一定要能訪問,如果不能訪問,微信不會發送通知。要和支付URL在一個目錄下
微信官方提供的SDK 和接口數據非常不規範,在使用的時候一定要代碼中的注意大小寫,出現了問題,仔細和微信官方提供的開發文件相對照,如果你使用的語言或開發框架提供了微信開發所用到庫,建議直接使用這些庫進行開發,這些庫可以幫助我們繞過微信為我們挖下的各種大坑小坑,減少調試難度、加快開發速度。
更多wordpress相關技術文章,請造訪wordpress教學欄位進行學習!
以上是wordpress如何實現微信支付的詳細內容。更多資訊請關注PHP中文網其他相關文章!