1. 程式人生 > >PHP開發之微信公眾號中進行支付寶支付

PHP開發之微信公眾號中進行支付寶支付

想必很多人都有過要在微信公眾號中進行支付寶支付的經歷,但是微信又遮蔽了阿里系所有的東西,網上百度了很多,都沒有完整的解決方案,可謂萬坑叢中過啊。剛剛踩完坑的袁小威就迫不及待的分享給大家咯。
切入正題,其實支付寶官方就微信公眾號中使用支付寶支付是給出瞭解決方案的【微信公眾平臺無法使用支付寶收付款的解決方案】,有DEMO可供下載下載參考,因此,袁小威基於官方提供的DEMO來實現了微信公眾號中進行支付寶支付。
呼叫支付寶手機網站支付服務端SDK部分可以下載官方DEMO來實現【各語言服務端SDK】,首先在支付配置檔案config.php裡配置好自己的引數,然後建立支付類:alipayMobile.class.php

,呼叫手機網站支付介面,話不多說,直接上程式碼:

class alipayMobile
{
         /**
     * 生成支付程式碼
     * @param   array   $order    訂單資訊
     * @param   array   $bodys    訂單名稱、描述
     */
    function get_code($order,$bodys)
    {
             require_once dirname ( __FILE__ ).DIRECTORY_SEPARATOR.'wappay/service/AlipayTradeService.php'
; require_once dirname ( __FILE__ ).DIRECTORY_SEPARATOR.'wappay/buildermodel/AlipayTradeWapPayContentBuilder.php'; require dirname ( __FILE__ ).DIRECTORY_SEPARATOR.'./config.php'; //商戶訂單號,商戶網站訂單系統中唯一訂單號,必填 $out_trade_no = $order['order_sn']; //訂單名稱,必填
$subject = urlencode($bodys); //付款金額,必填 $total_amount = $order['order_amount']; //商品描述,可空 $body = urlencode($bodys); //超時時間 $timeout_express="1m"; $payRequestBuilder = new AlipayTradeWapPayContentBuilder(); $payRequestBuilder->setBody($body); $payRequestBuilder->setSubject($subject); $payRequestBuilder->setOutTradeNo($out_trade_no); $payRequestBuilder->setTotalAmount($total_amount); $payRequestBuilder->setTimeExpress($timeout_express); $payResponse = new AlipayTradeService($config); $result=$payResponse->wapPay($payRequestBuilder,$config['return_url'],$config['notify_url']); return $result; } }
注:這裡有一個坑需要注意,在官方SDK的wappay/service/AlipayTradeService.php的aopclientRequestExecute方法中,有一個echo $result操作,這個操作是在你呼叫支付介面後直接跳轉支付寶方的支付頁的,這對我們後面做微信公眾號中支付寶支付是一個大坑(親測),一定要註釋掉這一行程式碼喲!

然後就是支付請求getPay方法了(此處分享已經去掉介面驗證等系列程式碼邏輯):

public function getPay(){
    //1.引入支付類檔案
    include_once "plugins/Payment/alipay/alipayMobile.class.php";
    $payment = new \alipayMobile();
    $order_id = I('order_id');
    //2.判斷引數是否為空
    if (!empty($order_id)){
        //3.根據訂單id查詢訂單是否存在
        $order = M('Order')->where(array('id'=>$order_id))->find();
        if ($order){//訂單存在
            //4.判斷該筆訂單是否已經支付,如已支付則返回支付失敗並給出相應提示
            if ($order['pay_status'] == '1'){
                exit(json_encode(array('status'=>'205','msg'=>'該訂單已支付,請勿重複提交!')));
            }
            $bodys = '訂單:'.$order['order_sn'] . '支付';
            //5.呼叫支付類中封裝的支付方法並對應傳參
            $result = $payment->get_code($order,$bodys);
            //6.返回result中的引數給前端
            exit(json_encode(array('status'=>'0','msg'=>'操作成功''result'=>$result))); 
        }else{
            //報錯:資料不存在
            exit(json_encode(array('status'=>'-200','msg'=>'訂單不存在,請核實後再提交!')));
        }
    }else{
        //報錯:缺少引數
        exit(json_encode(array('status'=>'-204','msg'=>'引數缺失,請核實!')));
    }
}
Ok,接下來本次分享的重點來了喲,前端接收到返回的資料後,需要做一些小處理,這裡剛剛下載的官方的解決方案DEMO就該起作用了:
首先要在頁面裡引入js檔案:ap.js;
其次,要將pay.htm檔案放到專案目錄下(檔案中引入ap.js檔案的路徑要確認是否正確,以及最後執行_AP.decode返回錯誤裡pay.htm#error要寫pay.htm的訪問url,如:http://examp.com/mobile/pay/pay.htm#error);
然後,在支付請求成功後對接收到的資料進行處理:
//接收支付請求成功後返回的資料
var datas = data.result;
//擷取,去掉後面script中自動提交表單部分程式碼後插入到頁面
$("#paywindow").append(datas.split('</form>')[0]);
//開始拼接url引數
var queryParam = '';
Array.prototype.slice.call(document.querySelectorAll("input[type=hidden]")).forEach(function (ele) {
    queryParam += ele.name + "=" + encodeURIComponent(ele.value) + '&';
});
var gotoUrl = document.querySelector("#alipaysubmit").getAttribute('action')+'&'+queryParam;
//呼叫ap.js方法
_AP.pay(gotoUrl);
注:支付發起頁和pay.htm頁面一定要引入ap.js以及確保路徑正確,不然不會成功。

至此,我們可以愉快的在微信公眾號中進行支付寶支付了。
支付提示

瀏覽器喚醒支付寶

確認支付
好了,一點點菜鳥心得,有不當之處歡迎留言指證交流,一起成長,喵,就是這樣!