前言、php
本文基於Hbuilder,使用mui、PHP進行開發html
最近作一個App支付的功能。大體流程是這樣的:(官方文檔有更詳細的說明)git
描述:
1.開始支付,發起簽名申請(簽名必須在服務器端進行)
2.服務器端接口返回簽名後的訂單信息
3.根據接口返回的訂單簽名信息,調用支付寶App進行支付
4.輸入支付密碼確認付款【無須操做】
5.支付後返回支付結果【無須操做】
6.商家App接到支付結果,而後傳遞給接口
7.接口中根據支付結果進行驗籤
8.接口中確認完成以後返回給商家App支付完成。
9.支付寶異步通知支付結果
10.接口新增處理異步支付結果 須要外網可訪問的地址github
其中一、3在本身的App中操做;二、九、10須要在服務器端進行;第六步我並無進行操做,直接進入支付結果頁面,在支付結果頁面判斷訂單的支付狀態express
由於在支付成功的同時支付寶會馬上異步發送信息給服務器端,即第九步,而後我在這裏處理了支付單和訂單狀態,這樣六、七、8就不須要操做了,直接進入結果頁判斷就好了。json
須要注意的是關於App的支付寶對接,有兩個版本,一個是老版本(移動支付),一個是新版本(支付寶App支付)。有新版固然要用新版的了。服務器
能夠使用支付寶給的sdk快速接入,App支付服務端DEMO&SDK,不嫌麻煩也能夠本身寫。。。。。微信
裏面有demo,網上也不少。最終處理完以後,返回的是一個請求字符串,具體參數:請求參數說明app
推薦GitHub上的PHP簽名模板:支付寶App支付新版 dom
生成的請求字符串:
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¬ify_url=http%3A%2F%2Fdomain.merchant.com%2Fpayment_notify&sign_type=RSA2×tamp=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/