微信支付開發實記

微信支付分爲JSAPI支付,掃碼支付,APP支付,小程序支付等不一樣的支付方式。但大致的支付過程是一致的,本文以JSAPI支付,也就是微信內的H5支付爲例,描述一下支付的整個開發流程。php

配置

商戶須要提早開通商戶平臺,並去公衆平臺或開放平臺提交微信支付申請,得到商戶號和祕鑰。前端

詳細文檔能夠看這裏小程序

支付流程

微信內網頁支付時序圖

微信支付的流程圖畫的很完整,開發前要把整個流程研究清楚。後端

整個流程,服務端須要作的有三件事。api

  1. 前端支付按鈕被觸發後,服務端要去調用 統一下單 接口,把預付單信息、支付參數和參數簽名返回給前端。前端根據這些參數喚起支付。
  2. 當用戶支付成功後,微信會給咱們一個回調通知,告知咱們支付結果。這一步要實現「完成訂單」操做,標記用戶已經成功支付,進入「發貨」流程。
  3. 提供一個查詢接口,讓前端再次確認是否支付成功。

統一下單

在支付前,商戶系統先調用該接口在微信支付後臺生成預支付交易單,一樣的,商戶系統也須要在本身的表裏記錄一筆「未完成訂單」。生成以後返回正確的預付單信息、支付參數和參數簽名返回給前端。前端根據這些參數喚起支付。微信

接口app

https://api.mch.weixin.qq.com/pay/unifiedorder微信支付

參數巨多,具體仍是看文檔url

這裏須要說明的一點是,咱們在調用這個接口時,須要籤一次名用來給微信作校驗,微信也返回了一個新的簽名用來給咱們作校驗,而後咱們還要返回給前端一個簽名,用來喚起支付。這三個簽名都不是同一個。調試

咱們不能直接把調用統一下單接口返回的簽名返回給前端,而是根據前端喚起支付的參數去從新簽名

注意,是根據前端喚起支付的參數去從新簽名,由於前端的參數名和後端的參數名會略微有差異,這裏須要當心。

說明:簽名的意圖是用來校驗身份,當前端把這些參數傳給微信,微信會把調用參數除去簽名後從新簽名,用來校驗簽名的正確性,因此用來簽名的參數名要和前端參數一致。

支付結果通知

在統一下單時咱們填了一個參數叫 notify_url,這是一個服務端的接口地址,微信在用戶支付成功後,會回調這個地址,告知咱們支付結果。

詳情看文檔

在這一步仍是須要作多點校驗的,省得被人有隙可乘。

  1. 校驗支付是否成功,不成功直接返回"FAIL"
  2. 校驗簽名和appid
  3. 校驗訂單是否完成(冪等校驗,防止微信屢次回調致使屢次訂單寫入)
  4. 訂單金額校驗

一通校驗完事以後就能夠作業務相關的事了。記得全部操做結束後返回"SUCCESS",否則微信會不斷髮起回調。

總結

  1. 流程圖描述的很清楚,要仔細閱讀流程圖。
  2. 調用完下單接口後要進行二次簽名,簽名的參數要看前端驗籤用哪些參數,即便是同一個參數,字段名也會跟第一次加簽不同。
  3. 前端支付完成以後微信會有一個回調,咱們須要作如下幾點校驗:
    1. 作冪等處理(由於一樣的通知微信可能發送屢次)。
    2. 校驗簽名,校驗APPID。
    3. 校驗訂單金額。
  4. 訂單狀態分爲 0-未支付 1-支付完成 2-支付失敗:
    1. 用戶觸發支付組件而後關閉或者殺掉進程微信不會給到後臺任何回覆,始終處於 0-未支付,因此這個狀態也是一個支付失敗狀態。
    2. 支付失敗比較少見(到如今沒有遇到過),好比簽名錯誤(發生在調試階段)。
  5. 微信回執表儘可能詳細的記錄微信傳回的全部必有參數,以備出問題時排查。
  6. 至今尚未找到微信本地調試的方法。

文章首發:https://www.jianshu.com/u/13cd86311525

相關文章
相關標籤/搜索