### 因為我做的這個是個APP,所以從APP的角度來看如何實現支付。
最簡單的一個思路就是 發送訂單的相關數據(比如 價格數量等)發送到后台 ,讓后台生成一個訂單給返回到前台,然后前台拿着這個訂單數據去調支付API
主要工作是在后台進行,前台我認為只是需要發起兩次請求。
[uni.requestPayment(OBJECT)官方文檔](https://uniapp.dcloud.io/api/plugins/payment)
## 下面是發送獲取訂單請求的代碼
```yaml
function getOrderInfo(orderType, payMethod, buyAmount, payPrice) {
// 獲取訂單的地址
let url = 根據自己實際情況配置;
uni.request({
url: url,
method: "POST",
header: {
userId,
userToken
},
data: {
userId: userId,
orderType: orderType,
buyAmount: buyAmount,
payPrice: countMoney,
payMethod: methods
},
success: (result) => {
console.log(result);
res(result);
},
fail: (e) => {
err(e);
}
})
})
}
```
## 下面是發送支付請求的代碼
```yaml
支付類型orderType 支付方式payMethod 1:微信APP 2:支付寶APP 支付數量buyAmount 支付金額 payPrice
async function requestPayment(orderType, payMethod, buyAmount, payPrice) {
// await login();
console.log("獲取訂單前")
let orderInfo = await getOrderInfo(orderType, payMethod, buyAmount, payPrice);
console.log("得到訂單信息", orderInfo);
if (orderInfo.statusCode !== 200) {
console.log("獲得訂單信息失敗", orderInfo);
uni.showModal({
content: "獲得訂單信息失敗",
showCancel: false
})
return;
}
// 去支付
// console.log(xinxi);
uni.requestPayment({
// 支付方式
provider: payMethod,
// 訂單內容
orderInfo: orderInfo.data.data,
success: (res) => {
console.log("success", JSON.stringify(res));
return res;
},
fail: (err) => {
console.log("fail", JSON.stringify(err));
return err;
}
})
}
```
這個我僅在APP使用,其他的地方不清數是否一致。
[PHP實現支付csdn搜索列表](https://so.csdn.net/so/search/s.do?q=php%E5%AE%9E%E7%8E%B0%E6%94%AF%E4%BB%98&t=&u=)
[JAVA實現支付csdn搜索列表](https://so.csdn.net/so/search/s.do?q=java%E5%AE%9E%E7%8E%B0%E6%94%AF%E4%BB%98&t=&u=)
#### 友情提示一哈,要實現支付 一定要把相關的配置給整好 不然微信支付會一直報錯。
環境配置:
在manifest.json中 APP SDK 配置中 勾選支付,配好appid
APP 模塊權限中勾選支付。
最后,制作了一個自定義基座,把自己APP的證書上傳。使用自定義基座運行實現了微信支付。
### 支付流程
1、支付寶支付
app—------調用支付接口(傳遞id,金錢,支付類型)
后台調用第三方,返回回調接口,和交易碼、商品名、金額
app通過sdk調用支付寶,傳遞商品名、回調地址、交易碼、金額
支付后查看第三方返回的狀態是成功還是失敗,還是處理中,成功的話調用后台接口獲取支付狀態
2、微信支付
app—------調用支付接口(傳遞id,金錢,支付類型)
后台調用第三方,返回預支付id
app把預支付id提交給微信,再刷新狀態接口
3、銀聯支付
app—------調用支付接口(傳遞id,金錢,支付類型)
后台調用第三方,返回銀聯交易號
app通過sdk 傳遞銀聯交易號給銀聯做支付
4、ios內購
1.客戶端向Appstore請求購買產品,Appstore驗證產品成功后,從客戶端的Apple賬戶中扣費。
2.Appstore向客戶端返回一段receipt-data(票據),里面記錄了本次交易的證書和簽名信息。
3.客戶端向我們可以信任的服務器(后台)提供receipt-data
4.服務器對receipt-data進行一次base64編碼
5.把編碼后的receipt-data發往itunes.appstore進行驗證
6.itunes.appstore返回驗證結果給服務器
7.服務器對商品購買狀態以及商品類型,向客戶端發放相應的道具與推送數據更新通知
漏票原因及解決辦法
出現的兩種驗證方式:
IAP built-in Model(本地驗證):此種方式跳過來3-7步,在第2步中拿到票據直接向itunes.appstore請求驗證票據,根據票據的結果來修改數據。有一些單機游戲因為不涉及后台服務器會采取此種方式,但由此單來的不安全也很明顯,比如一些越獄的手機會很容易對此進行一些數據操作。這里暫不做討論。
IAP Server Model(服務器驗證):如果把數據放在服務器做校驗(如實走完1-7的流程),就不用擔心客戶端出現偽造票據等問題。但是這樣還會出現問題。
想象一下,如果得到票據說明蘋果已經扣款成功,就在這時向服務器發送票據驗證的時候出現來異常,這個時候可能網絡突然斷了,未把票據發送的服務器驗證,導致明明已經扣了款,卻沒有收到相應的內購產品,出現了漏單問題。
一:得到票據,立即保存本地,並向服務器驗證
二:驗證成功,刪除本地保存數據。若未成功,再次驗證重試。
三:APP重啟時,如有本地票據則與服務器進行認證,若認證成功則刪除票據。
四:若以上流程還未能解決漏單問題,則可在APP增加類似找回按鈕,依據本地保存票據進行找回(流程三)。
注:服務器需建立表單記錄票據數據,避免多次增加內購產品。
作者:仰望星空_4645
鏈接:https://www.jianshu.com/p/d9a8936d5932
來源:簡書
著作權歸作者所有。商業轉載請聯系作者獲得授權,非商業轉載請注明出處。
# 最后,讀者如果發現了什么問題,望不吝賜教,拜謝各位大佬。