# 1. 接口規(guī)則
為了在保證支付安全的前提下,帶給商戶(hù)簡(jiǎn)單、一致且易用的開(kāi)發(fā)體驗(yàn),我們推出了全新的微信支付APIv3接口。該版本API的具體規(guī)則請(qǐng)參考APIv3接口規(guī)則。
# 2. 開(kāi)發(fā)準(zhǔn)備
# 2.1. 搭建和配置開(kāi)發(fā)環(huán)境
為了幫助開(kāi)發(fā)者調(diào)用開(kāi)放接口,我們提供了JAVA、PHP、GO三種語(yǔ)言版本的開(kāi)發(fā)庫(kù),封裝了簽名生成、簽名驗(yàn)證、敏感信息加/解密、媒體文件上傳 等基礎(chǔ)功能(更多語(yǔ)言版本的開(kāi)發(fā)庫(kù)將在近期陸續(xù)提供)。
測(cè)試步驟:
1、根據(jù)自身開(kāi)發(fā)語(yǔ)言,選擇對(duì)應(yīng)的開(kāi)發(fā)庫(kù)并構(gòu)建項(xiàng)目,具體配置請(qǐng)參考下面鏈接的詳細(xì)說(shuō)明:
- wechatpay-java (opens new window)(推薦)、wechatpay-apache-httpclient (opens new window),適用于Java開(kāi)發(fā)者。
- 注:當(dāng)前開(kāi)發(fā)指引接口JAVA示例代碼采用wechatpay-apache-httpclient版本。
- wechatpay-php (opens new window)(推薦)、wechatpay-guzzle-middleware (opens new window),適用于PHP開(kāi)發(fā)者。
- 注:當(dāng)前開(kāi)發(fā)指引接口PHP示例代碼采用wechatpay-guzzle-middleware版本。
- wechatpay-go (opens new window),適用于Go開(kāi)發(fā)者。
更多資源可前往微信支付開(kāi)發(fā)者社區(qū) (opens new window)搜索查看。
2、創(chuàng)建加載商戶(hù)私鑰、加載平臺(tái)證書(shū)、初始化httpClient的通用方法。
3、基于接口的示例代碼,替換請(qǐng)求參數(shù)后可發(fā)起測(cè)試。
說(shuō)明:
- 上面的開(kāi)發(fā)庫(kù)為微信支付官方開(kāi)發(fā)庫(kù),其它沒(méi)有審核或者控制下的第三方工具和庫(kù),微信支付不保證它們的安全性和可靠性。通過(guò)包管理工具引入SDK后,可根據(jù)下面每個(gè)接口的示例代碼替換相關(guān)參數(shù)后進(jìn)行快速測(cè)試。
- 開(kāi)發(fā)者如果想詳細(xì)了解簽名生成、簽名驗(yàn)證、敏感信息加/解密、媒體文件上傳等常用方法的具體代碼實(shí)現(xiàn),可閱讀下面的詳細(xì)說(shuō)明:
- 簽名生成
- 簽名驗(yàn)證
- 敏感信息加解密
- merchantPrivateKey(私鑰)
- wechatpayCertificates(平臺(tái)證書(shū))
- APIV3Key(V3 key)
- 如想更詳細(xì)的了解我們的接口規(guī)則,可查看我們的接口規(guī)則指引文檔。
# 2.2. 業(yè)務(wù)開(kāi)發(fā)配置
# 2.2.1. 賬號(hào)申請(qǐng)指引
- 小程序開(kāi)通微信支付,即申請(qǐng)或復(fù)用微信支付商戶(hù)號(hào),申請(qǐng)完小程序后,登錄小程序后臺(tái) (opens new window)。點(diǎn)擊左側(cè)導(dǎo)航欄的微信支付,在頁(yè)面中進(jìn)行開(kāi)通。(開(kāi)通申請(qǐng)要求小程序已發(fā)布上線(xiàn))
- 點(diǎn)擊開(kāi)通按鈕后,有2種方式可以獲取微信支付能力,新申請(qǐng)微信支付商戶(hù)號(hào)或綁定一個(gè)已有的微信支付商戶(hù)號(hào),請(qǐng)根據(jù)你的業(yè)務(wù)需要和具體情況選擇,只能二選一。開(kāi)通指引 (opens new window)
# 2.2.2. 服務(wù)器配置要求
小程序訪(fǎng)問(wèn)商戶(hù)服務(wù)都是通過(guò)HTTPS,開(kāi)發(fā)部署的時(shí)候需要HTTPS服務(wù)器。
服務(wù)器域名配置。
- 每個(gè)微信小程序需要事先設(shè)置通信域名,小程序只可以跟指定的域名進(jìn)行網(wǎng)絡(luò)通信。包括普通 HTTPS 請(qǐng)求(wx.request)、上傳文件(wx.uploadFile)、下載文件(wx.downloadFile)和
WebSocket
通信(wx.connectSocket) - 從基礎(chǔ)庫(kù) 2.4.0 開(kāi)始,網(wǎng)絡(luò)接口允許與局域網(wǎng) IP 通信,但要注意 不允許與本機(jī) IP 通信
- 每個(gè)微信小程序需要事先設(shè)置通信域名,小程序只可以跟指定的域名進(jìn)行網(wǎng)絡(luò)通信。包括普通 HTTPS 請(qǐng)求(wx.request)、上傳文件(wx.uploadFile)、下載文件(wx.downloadFile)和
注意
- 域名只支持 HTTPS (wx.request、wx.uploadFile、wx.downloadFile)和 wss(wx.connectSocket)協(xié)議。
- 域名不能使用 IP 地址(小程序的局域網(wǎng) IP 除外)或
localhost
。 - 可以配置端口,如
https://myserver.com:8080
,但是配置后只能向https://myserver.com:8080/
發(fā)起請(qǐng)求。如果向https://myserver.com、https://myserver.com:9091
等 URL 請(qǐng)求則會(huì)失敗。 - 如果不配置端口。如
https://myserver.com
,那么請(qǐng)求的 URL 中也不能包含端口,甚至是默認(rèn)的 443 端口也不可以。如果向https://myserver.com:443
請(qǐng)求則會(huì)失敗。 - 域名必須經(jīng)過(guò) ICP 備案。
- 出于安全考慮,
API.weixin.qq.com
不能被配置為服務(wù)器域名,相關(guān)API也不能在小程序內(nèi)調(diào)用。 開(kāi)發(fā)者應(yīng)將AppSecret
保存到后臺(tái)服務(wù)器中,通過(guò)服務(wù)器使用 getAccessToken (opens new window) 接口獲取access_token
,并調(diào)用相關(guān) API。 - 不支持配置父域名,使用子域名。
- 可查閱小程序網(wǎng)絡(luò)請(qǐng)求 (opens new window)以了解更多信息。
# 3. 快速接入
# 3.1. 業(yè)務(wù)流程圖
重點(diǎn)步驟說(shuō)明:
步驟4: 用戶(hù)下單發(fā)起支付,商戶(hù)可通過(guò)JSAPI下單創(chuàng)建支付訂單。
步驟9: 商戶(hù)小程序內(nèi)使用小程序調(diào)起支付API(wx.requestPayment)發(fā)起微信支付,詳見(jiàn)小程序API文檔 (opens new window)。
步驟16: 用戶(hù)支付成功后,商戶(hù)可接收到微信支付支付結(jié)果通知支付通知API。
步驟21: 商戶(hù)在沒(méi)有接收到微信支付結(jié)果通知的情況下需要主動(dòng)調(diào)用查詢(xún)訂單API查詢(xún)支付結(jié)果。
# 3.2. API接入(含示例代碼)
本章節(jié)展示了如何使用微信支付服務(wù)端 SDK 快速接入小程序支付產(chǎn)品,完成與微信支付對(duì)接的部分。
注意
- 文檔中的代碼示例是用來(lái)闡述 API 基本使用方法,代碼中的示例參數(shù)需替換成商戶(hù)自己賬號(hào)及請(qǐng)求參數(shù)才能跑通。
- 以下接入步驟僅提供參考,請(qǐng)商戶(hù)結(jié)合自身業(yè)務(wù)需求進(jìn)行評(píng)估、修改。
# 3.2.1. 【服務(wù)端】小程序下單
步驟說(shuō)明:
用戶(hù)通過(guò)商戶(hù)小程序進(jìn)入商戶(hù)網(wǎng)頁(yè),當(dāng)用戶(hù)選擇相關(guān)商品購(gòu)買(mǎi)時(shí),商戶(hù)系統(tǒng)先調(diào)用該接口在微信支付服務(wù)后臺(tái)生成預(yù)支付交易單。
重要入?yún)⒄f(shuō)明:
- out_trade_no: 商戶(hù)系統(tǒng)內(nèi)部訂單號(hào),只能是數(shù)字、大小寫(xiě)字母_-*且在同一個(gè)商戶(hù)號(hào)下唯一。
- description: 商品描述。
- notify_url: 支付回調(diào)通知URL,該地址必須為直接可訪(fǎng)問(wèn)的URL,不允許攜帶查詢(xún)串。
- total: 訂單總金額,單位為分。
- OpenID: OpenID是微信用戶(hù)在AppID下的唯一用戶(hù)標(biāo)識(shí)(AppID不同,則獲取到的OpenID就不同),可用于永久標(biāo)記一個(gè)用戶(hù)。OpenID獲取方式請(qǐng)參考以下文檔小程序獲取OpenID (opens new window)、公眾號(hào)獲取OpenID (opens new window)、App獲取OpenID (opens new window)。
更多參數(shù)、響應(yīng)詳情及錯(cuò)誤碼請(qǐng)參見(jiàn)JSAPI下單接口文檔。
# 3.2.2.【客戶(hù)端】小程序調(diào)起支付API
步驟說(shuō)明: 通過(guò)JSAPI下單API成功獲取預(yù)支付交易會(huì)話(huà)標(biāo)識(shí)(prepay_id) 后,需要通過(guò)JSAPI調(diào)起支付API來(lái)調(diào)起微信支付收銀臺(tái)。
注意
- 此API需要將請(qǐng)求參數(shù)進(jìn)行簽名(參與簽名的參數(shù)為:AppID、timeStamp、nonceStr、package,參數(shù)區(qū)分大小寫(xiě))。
- AppID必須為最后拉起收銀臺(tái)的小程序AppID。
重要入?yún)⒄f(shuō)明:
- package: JSAPI下單接口返回的prepay_id參數(shù)值,提交格式如:prepay_id=***。
- signType: 該接口V3版本僅支持RSA。
- paySign: 簽名。
paySign生成規(guī)則、響應(yīng)詳情及錯(cuò)誤碼請(qǐng)參見(jiàn) 小程序調(diào)起支付接口文檔。
# 3.2.3. 【服務(wù)端】接收支付結(jié)果通知
步驟說(shuō)明: 當(dāng)用戶(hù)完成支付,微信會(huì)把相關(guān)支付結(jié)果將通過(guò)異步回調(diào)的方式通知商戶(hù),商戶(hù)需要接收處理,并按文檔規(guī)范返回應(yīng)答
注意
- 支付結(jié)果通知是以POST 方法訪(fǎng)問(wèn)商戶(hù)設(shè)置的通知URL,通知的數(shù)據(jù)以JSON 格式通過(guò)請(qǐng)求主體(BODY)傳輸。通知的數(shù)據(jù)包括了加密的支付結(jié)果詳情。
- 加密不能保證通知請(qǐng)求來(lái)自微信。微信會(huì)對(duì)發(fā)送給商戶(hù)的通知進(jìn)行簽名,并將簽名值放在通知的HTTP頭Wechatpay-Signature。商戶(hù)應(yīng)當(dāng)驗(yàn)證簽名,以確認(rèn)請(qǐng)求來(lái)自微信,而不是其他的第三方。簽名驗(yàn)證的算法請(qǐng)參考 《微信支付API v3簽名驗(yàn)證》。
- 支付通知HTTP應(yīng)答碼為200或204才會(huì)當(dāng)作正常接收,當(dāng)回調(diào)處理異常時(shí),應(yīng)答的HTTP狀態(tài)碼應(yīng)為500,或者4xx。
- 商戶(hù)成功接收到回調(diào)通知后應(yīng)返回成功的HTTP應(yīng)答碼為200或204。
- 同樣的通知可能會(huì)多次發(fā)送給商戶(hù)系統(tǒng)。商戶(hù)系統(tǒng)必須能夠正確處理重復(fù)的通知。 推薦的做法是,當(dāng)商戶(hù)系統(tǒng)收到通知進(jìn)行處理時(shí),先檢查對(duì)應(yīng)業(yè)務(wù)數(shù)據(jù)的狀態(tài),并判斷該通知是否已經(jīng)處理。如果未處理,則再進(jìn)行處理;如果已處理,則直接返回結(jié)果成功。在對(duì)業(yè)務(wù)數(shù)據(jù)進(jìn)行狀態(tài)檢查和處理之前,要采用數(shù)據(jù)鎖進(jìn)行并發(fā)控制,以避免函數(shù)重入造成的數(shù)據(jù)混亂。
- 對(duì)后臺(tái)通知交互時(shí),如果微信收到商戶(hù)的應(yīng)答不符合規(guī)范或超時(shí),微信認(rèn)為通知失敗,微信會(huì)通過(guò)一定的策略定期重新發(fā)起通知,盡可能提高通知的成功率,但微信不保證通知最終能成功。(通知頻率為15s/15s/30s/3m/10m/20m/30m/30m/30m/60m/3h/3h/3h/6h/6h - 總計(jì) 24h4m)。
特別提醒: 商戶(hù)系統(tǒng)對(duì)于開(kāi)啟結(jié)果通知的內(nèi)容一定要做簽名驗(yàn)證,并校驗(yàn)通知的信息是否與商戶(hù)側(cè)的信息一致,防止數(shù)據(jù)泄露導(dǎo)致出現(xiàn)“假通知”,造成資金損失。
更多參數(shù)、響應(yīng)詳情及錯(cuò)誤碼請(qǐng)參見(jiàn) 支付結(jié)果通知接口文檔。
# 3.2.4. 【服務(wù)端】查詢(xún)訂單
步驟說(shuō)明: 當(dāng)商戶(hù)后臺(tái)、網(wǎng)絡(luò)、服務(wù)器等出現(xiàn)異常,商戶(hù)系統(tǒng)最終未接收到支付通知時(shí),商戶(hù)可通過(guò)查詢(xún)訂單接口核實(shí)訂單支付狀態(tài)。
注意
- 查詢(xún)訂單可通過(guò)微信支付訂單號(hào)和商戶(hù)訂單號(hào)兩種方式查詢(xún),兩種查詢(xún)方式返回結(jié)果相同。
需要調(diào)用查詢(xún)接口的情況:
- 當(dāng)商戶(hù)后臺(tái)、網(wǎng)絡(luò)、服務(wù)器等出現(xiàn)異常,商戶(hù)系統(tǒng)最終未接收到支付通知。
- 調(diào)用支付接口后,返回系統(tǒng)錯(cuò)誤或未知交易狀態(tài)情況。
- 調(diào)用付款碼支付API,返回USERPAYING的狀態(tài)。
- 調(diào)用關(guān)單或撤銷(xiāo)接口API之前,需確認(rèn)支付狀態(tài)。
示例代碼(通過(guò)微信訂單號(hào)查詢(xún)):
更多參數(shù)、響應(yīng)詳情及錯(cuò)誤碼請(qǐng)參見(jiàn) 微信支付訂單號(hào)/商戶(hù)訂單號(hào)接口文檔。
# 3.2.5. 【服務(wù)端】關(guān)閉訂單
步驟說(shuō)明: 當(dāng)商戶(hù)訂單支付失敗需要生成新單號(hào)重新發(fā)起支付,要對(duì)原訂單號(hào)調(diào)用關(guān)單,避免重復(fù)支付;系統(tǒng)下單后,用戶(hù)支付超時(shí),系統(tǒng)退出不再受理,避免用戶(hù)繼續(xù),請(qǐng)調(diào)用關(guān)單接口。
注意
- 關(guān)單沒(méi)有時(shí)間限制,建議在訂單生成后間隔幾分鐘(最短5分鐘)再調(diào)用關(guān)單接口,避免出現(xiàn)訂單狀態(tài)同步不及時(shí)導(dǎo)致關(guān)單失敗。
- 已支付成功的訂單不能關(guān)閉。
更多參數(shù)、響應(yīng)詳情及錯(cuò)誤碼請(qǐng)參見(jiàn) 關(guān)閉訂單接口文檔
# 3.2.6. 【服務(wù)端】申請(qǐng)交易賬單
步驟說(shuō)明: 微信支付按天提供交易賬單文件,商戶(hù)可以通過(guò)該接口獲取賬單文件的下載地址。
更多參數(shù)、響應(yīng)詳情及錯(cuò)誤碼請(qǐng)參見(jiàn) 申請(qǐng)交易賬單接口文檔。
# 3.2.7. 【服務(wù)端】下載賬單
步驟說(shuō)明: 申請(qǐng)交易賬單接口獲取到賬單下載地址(download_url)后,再通過(guò)該接口獲取到對(duì)應(yīng)的賬單文件,文件內(nèi)包含交易相關(guān)的金額、時(shí)間、營(yíng)銷(xiāo)等信息,供商戶(hù)核對(duì)訂單、退款、銀行到賬等情況。
注意
- 賬單文件的下載地址的有效時(shí)間為30s。
- 強(qiáng)烈建議商戶(hù)將實(shí)際賬單文件的哈希值和之前從接口獲取到的哈希值進(jìn)行比對(duì),以確認(rèn)數(shù)據(jù)的完整性。
- 該接口響應(yīng)的信息請(qǐng)求頭中不包含微信接口響應(yīng)的簽名值,因此需要跳過(guò)驗(yàn)簽的流程。
- 微信在次日9點(diǎn)啟動(dòng)生成前一天的對(duì)賬單,建議商戶(hù)10點(diǎn)后再獲取。
更多參數(shù)、響應(yīng)詳情及錯(cuò)誤碼請(qǐng)參見(jiàn) 下載賬單接口文檔。
# 4. 常見(jiàn)問(wèn)題
# Q:在小程序內(nèi)通過(guò)外部H5頁(yè)面調(diào)起支付報(bào)錯(cuò)
A:在小程序內(nèi)通過(guò)外部H5頁(yè)面調(diào)起支付報(bào)錯(cuò)。
# Q:調(diào)起小程序支付報(bào)“商戶(hù)號(hào)該產(chǎn)品權(quán)限未開(kāi)通”
A:請(qǐng)按以下幾點(diǎn)進(jìn)行排查:
- 請(qǐng)檢查請(qǐng)求參數(shù)是否正確,如請(qǐng)求參數(shù)中的AppID是否與小程序?qū)?yīng)。
- AppID對(duì)應(yīng)的小程序是否有開(kāi)通小程序支付功能,權(quán)限狀態(tài)是否正常,可登錄商戶(hù)平臺(tái)核實(shí)。
- AppID與商戶(hù)號(hào)是否存在綁定關(guān)系,可登錄商戶(hù)平臺(tái)核實(shí)。
# Q:小程序開(kāi)通微信支付有哪幾種方式
A:可通過(guò)以下兩種方式開(kāi)通:
- 綁定已有公眾號(hào)的微信支付:耗時(shí)10分鐘即可,只需原有公眾號(hào)開(kāi)通微信支付,小程序微信支付可以選擇綁定原來(lái)的微信支付商戶(hù)號(hào),即可開(kāi)通成功。
- 新申請(qǐng)微信支付:耗時(shí)需要1-5個(gè)工作日,需要提交和申請(qǐng)小程序一樣的資料進(jìn)行審核,審核通過(guò)后才能開(kāi)通成功。