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以及確保路徑正確,不然不會成功。

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

瀏覽器喚醒支付寶

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

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章