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