1 微信支付的坑
1.1 不能用前端傳遞過來的金額
訂單的商品金額要從資料庫獲取,前端只傳商品 id。
1.2 交易型別trade type欄位不要傳錯
v2版API,不同交易型別,要呼叫的支付方式也不同。
1.3 二次簽名
下單時,在拿到預支付交易會話標識時,要進行二次簽名操作。二次簽名後的值,才能返回給前端使用。
1.4 小程式可繫結到其它公司的商戶下
可同時關聯到多個商戶號:
1.5 微信支付的單位是分,最小金額是0.01元
支付寶是元。
1.6 做避免重複消費的處理
處理成功之後不要再進行二次處理了,那首先是有事務操作。
第一次處理成功後,需要更新對應訂單的狀態。更新完成後,下次再處理時,直接返回成功,不再進行實際業務處理。
也可以拿這個訂單號加分散式鎖,保證對同一個使用者,同時只能處理一個訂單。
1.7 支付結果驗籤
對支付結果通知,一定要拿配置的私鑰進行驗籤處理。
// 處理內部業務邏輯
try {
// 支付結果驗籤
boolean valid = WXPayUtil.isSignatureValid(map1, weixinpaypartner);
if (valid == false) {
log.info("簽名不一致" + outTradeNo);
return "ERROR";
} else {
//1、更新訂單狀態
dealAfterSuccess(basOrder, time_end, transaction_id, result_code);
log.info("驗籤成功" + outTradeNo);
result = CommUtils.setXml("SUCCESS", "OK");
log.info("收到非同步通知返回微信的內容--" + result);
return result;
}
} catch (Exception e) {
e.printStackTrace();
return "ERROR";
}
不驗籤也可以繼續執行,但支付結果頁容易被偽造哦!
1.8 對支付結果通知處理邏輯中的非事務性操作做操作記錄
可能在支付通知後,透過小程式給使用者傳送模板訊息通知或公眾號訊息通知觸達。若這時事務處理失敗,但結果傳送成功了,會造成啥結果?那你下次是否要重新處理這個訂單流程,在重新處理訂單時難道再發一次推送嗎?肯定不可以。
所以最好拿訂單號作為標識,判斷記錄這個訂單是否已經有過啥事務性、非事務性操作,下次或者是訂單補償時,就只處理事務性操作,不再處理非事務性操作。
1.9 v2的統一下單的介面
服務號、H5下單和小程式下單都可呼叫,甚至app下單都可以呼叫。
關注我,緊跟本系列專欄文章,咱們下篇再續!
作者簡介:魔都架構師,多家大廠後端一線研發經驗,在分散式系統設計、資料平臺架構和AI應用開發等領域都有豐富實踐經驗。
各大技術社群頭部專家博主。具有豐富的引領團隊經驗,深厚業務架構和解決方案的積累。
負責:
- 中央/分銷預訂系統效能最佳化
- 活動&券等營銷中臺建設
- 交易平臺及資料中臺等架構和開發設計
- 車聯網核心平臺-物聯網連線平臺、大資料平臺架構設計及最佳化
- LLM Agent應用開發
- 區塊鏈應用開發
- 大資料開發挖掘經驗
- 推薦系統專案
目前主攻市級軟體專案設計、構建服務全社會的應用系統。
參考:
- 程式設計嚴選網
本文由部落格一文多發平臺 OpenWrite 釋出!