支付寶App支付的一些問題


前言、

        本文基於Hbuilder,使用mui、PHP進行開發

一、說明

        最近做一個App支付的功能。大致流程是這樣的:(官方文檔有更詳細的說明)

描述:
  1.開始支付,發起簽名申請(簽名必須在服務器端進行)
  2.服務器端接口返回簽名后的訂單信息
  3.根據接口返回的訂單簽名信息,調用支付寶App進行支付
  4.輸入支付密碼確認付款【無須操作】
  5.支付后返回支付結果【無須操作】
  6.商家App接到支付結果,然后傳遞給接口
  7.接口中根據支付結果進行驗簽 
  8.接口中確認完成之后返回給商家App支付完成。
  9.支付寶異步通知支付結果 
  10.接口新增處理異步支付結果 需要外網可訪問的地址

其中1、3在自己的App中操作;2、9、10需要在服務器端進行;第六步我並沒有進行操作,直接進入支付結果頁面,在支付結果頁面判斷訂單的支付狀態

因為在支付成功的同時支付寶會立刻異步發送信息給服務器端,即第九步,然后我在這里處理了支付單和訂單狀態,這樣6、7、8就不需要操作了,直接進入結果頁判斷就行了。

 需要注意的是關於App的支付寶對接,有兩個版本,一個是老版本(移動支付),一個是新版本(支付寶App支付)。有新版當然要用新版的了。

二、服務器端訂單信息簽名

        可以使用支付寶給的sdk快速接入,App支付服務端DEMO&SDK,不嫌麻煩也可以自己寫。。。。。

       里面有demo,網上也很多。最終處理完之后,返回的是一個請求字符串,具體參數:請求參數說明

       推薦GitHub上的PHP簽名模板:支付寶App支付新版  

       生成的請求字符串:

app_id=2015052600090779&biz_content=%7B%22timeout_express%22%3A%2230m%22%2C%22product_code%22%3A%22QUICK_MSECURITY_PAY%22%2C%22total_amount%22%3A%220.01%22%2C%22subject%22%3A%221%22%2C%22body%22%3A%22%E6%88%91%E6%98%AF%E6%B5%8B%E8%AF%95%E6%95%B0%E6%8D%AE%22%2C%22out_trade_no%22%3A%22IQJZSRC1YMQB5HU%22%7D&charset=utf-8&format=json&method=alipay.trade.app.pay&notify_url=http%3A%2F%2Fdomain.merchant.com%2Fpayment_notify&sign_type=RSA2&timestamp=2016-08-25%2020%3A26%3A31&version=1.0&sign=cYmuUnKi5QdBsoZEAbMXVMmRWjsuUj%2By48A2DvWAVVBuYkiBj13CFDHu2vZQvmOfkjE0YqCUQE04kqm9Xg3tIX8tPeIGIFtsIyp%2FM45w1ZsDOiduBbduGfRo1XRsvAyVAv2hCrBLLrDI5Vi7uZZ77Lo5J0PpUUWwyQGt0M4cj8g%3D

三、根據簽名拉起支付寶進行付款

       HBuilder 基座已實現H5 plus的支付API,現已支持支付寶App支付(移動快捷支付)和微信支付。我們只需要在HBuilder中配置上就好了,具體配置查看: HBuilder支付插件配置

plus API使用步驟:
1. 調用plus.payment.getChannels()獲取系統支持的支付通道

        // 獲取Hbuilder內置的支付通道
        plus.payment.getChannels(function(channels){
            for (var i in channels) {
                if (channels[i].id == "wxpay") {
                    wxChannel=channels[i];
                }else if(channels[i].id == "alipay"){
                    aliChannel=channels[i];
                }
            }
        },function(e){
            alert("獲取支付通道失敗:"+e.message);
            return 0;
        });

2. 調用plus.payment.request()發起支付請求。

        //拉起支付
        plus.payment.request(aliChannel,res.data.orderstr,function(result){
            alert('支付成功');
            console.log(JSON.stringify(result));//將會同步返回支付結果數據,根據自己需求進行處理,是否回傳服務器
        },function(error){
            alert('支付失敗');
            console.log(JSON.stringify(error));//可查看狀態碼,失敗信息
        });
        //說明:aliChannel是上面取到的對應內置支付通道信息,res.data.orderstr就是訂單信息簽名之后返回的請求字符串

四、異步接收支付通知

        在用戶輸入密碼並且成功支付的同時,支付寶就會發送異步數據到你設置的 notifyUrl 中,這里還需要驗證簽名:

        $aop = new AopClient;
        $aop->alipayrsaPublicKey = '請填寫支付寶公鑰,一行字符串';
        $flag = $aop->rsaCheckV1($_POST, NULL, "RSA2");
    AopClient類中的一個方法 rsaCheckV1()就完成解簽,之后需要進行一系列數據驗證就完成了。

五、出現的問題及問題排查辦法

       大部分問題:APP支付FAQ

        關於:交易訂單處理失敗,請稍后再試 ALI38173 ,ALI38173出現肯定是因為(二)中的簽名參數錯誤或簽名格式,仔細檢查對比參數:請求參數說明

  我的錯誤是:最后生成的字符串用htmlspecialchars進行轉義了,實際不需要轉義,按照GitHub中的文檔編寫完全沒有問題。

  解決辦法:復制官方文檔中生成好的串,直接放在app中拉起支付,確認是服務器端還是App端出錯。

       附上一個錯誤排查方案:https://blog.csdn.net/sinat_32575213/article/details/79695142

六、結束

        文中出現的鏈接:

/*
    移動支付(老版):https://docs.open.alipay.com/59/104352/

支付寶App支付(新版):https://docs.open.alipay.com/204/105297/
App支付服務端DEMO&SDK:https://docs.open.alipay.com/54/106370
GitHub支付寶App支付新版(推薦):https://github.com/dcloudio/H5P.Server/tree/master/payment/alipayrsa2
訂單簽名參數說明:https://docs.open.alipay.com/204/105465/
HBuilder支付插件配置:http://ask.dcloud.net.cn/article/71 (這里面的支付寶的簽名鏈接參數是老版本的,只看配置就ok)
APP支付FQA:https://support.open.alipay.com/docs/doc.htm?spm=a219a.7386797.0.0.JUPUDC&treeId=193&articleId=105849&docType=1#s8
*/

       其他文檔:(只看上面的文檔就足夠了,下面文檔有bug,僅供參考)

               支付寶APP支付-php后台簽名以及驗簽:https://blog.csdn.net/kunpeng1987/article/details/73649710

               Dcloud中mui 微信支付和支付寶支付接口完美實現付款代碼(PHP支付寶demo):https://www.erdangjiade.com/php/2475.html

               支付寶官方文檔,生成RSA密匙:https://docs.open.alipay.com/291/105971/

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM