一、 選擇場景,查看開發文檔.

這里我選擇的是Native支付、API文檔是V2.(
文檔V3與V2區別)
模式一:
開發前,商戶必須在公眾平台后台設置支付回調URL。URL實現的功能:接收用戶掃碼后微信支付系統回調的productid和openid;

模式二:商戶后台系統先調用微信支付的統一下單接口,微信后台系統返回鏈接參數code_url,商戶后台系統將code_url值生成二維碼圖片,用戶使用微信客戶端掃碼后發起支付。
注意:code_url有效期為2小時,過期后掃碼不能再發起支付。

模式一是先根據微信支付規定格式生成二維碼,當客戶掃描之后通知微信支付系統,微信系統再和商戶后台系統進行一系列的操作最終發起用戶端支付流程(需設置支付回調url),而
模式二則更加簡單,是先在商戶后台系統生成訂單信息,然后就調用微信系統的統一下單api,商戶系統將返回的結果生成二維碼供用戶掃描即可.
三、下載Demo

四、設置必填參數
我這里選擇的是c#,運行需要設置三個參數,又因為選擇模式二,還需要設置NotifyUrl
APPID:綁定支付的APPID
MCHID:商戶號(必須配置)
KEY:商戶支付密鑰,參考開戶郵件設置(必須配置),請妥善保管,避免密鑰泄露
NotifyUrl:支付結果通知回調url,用於商戶接收支付結果
- 獲取APPID需要看下圖,微信支付賬號是沒有APPID的,所以需要APPID必須關聯微信的公眾平台或開放平台才可以擁有APPID.(支付平台關聯APPID的連接),關聯之后需要微信公眾/開放平台審核通過.
- 獲取MCHID,一般微信支付號申請的規則都是 xxx@MCHID,所以查看自己登陸賬號@字符后面的內容就是MCHID.或者在上方導航欄中 交易中心--->電子憑證--->商戶號
- 設置KEY 賬戶中心--->API安全--->API秘鑰 設置秘鑰需要32個字符,只允許輸入數字和英文大小寫字母的組合。(var token =Guid.NewGuid().ToString("N"))
- NotifyUrl 填寫自己項目接受微信支付通知的地址(外網可訪問),開發時可用花生殼.
五、開發中遇到的坑
1.total_fee(總金額)單位為/分,與支付寶默認金額/元不一致.
2.傳遞的參數中不能包含中文字符.由於demo中默認的簽名算法是 HMAC-SHA256,而CalcHMACSHA256Hash()中使用的Encoding.Default(Windwos默認是gbk).
所以只需將 WxPayData.CalcHMACSHA256Hash() 方法中的 Encoding.Default 改為Encoding.UTF8 即可.
3.通知回調函數中校驗簽名時出錯,將接受到的xml轉化為WxPayData,然后調用CheckSign(WxPayData.SIGN_TYPE_HMAC_SHA256)出錯的原因是因為MakeSign
方法中如果選擇的是WxPayData.SIGN_TYPE_HMAC_SHA256他默認加密后得值為小寫,而回調函數中的sign為大寫.所以只需將 WxPayData.MakeSign() 中的
CalcHMACSHA256Hash() 方法的值ToUpper()之后再返回就OK了.(我的Notify方法)
[HttpPost] [AllowAnonymous] public string Notify() { Stream inputstream = Request.InputStream; byte[] b = new byte[inputstream.Length]; inputstream.Read(b, 0, (int)inputstream.Length); string inputstr = Encoding.UTF8.GetString(b); SiteHelper.LogPayInfo($"WxPayApi PayResult :{inputstr.ToJson()}"); WxPayData _reciveResult = new WxPayData(); _reciveResult.FromXml(inputstr); //校驗簽名以及查詢結果 if (!_reciveResult.CheckSign(WxPayData.SIGN_TYPE_HMAC_SHA256) || _reciveResult.GetValue("result_code").ToString() !="SUCCESS" || _reciveResult.GetValue("return_code").ToString() != "SUCCESS") { WxPayData _returnErrResult = new WxPayData(); _returnErrResult.SetValue("return_code", "FAIL"); _returnErrResult.SetValue("return_msg", "ERR"); return _returnErrResult.ToXml(); } //ToDo 查詢數據庫訂單金額與參數中的金額對比,以及修改數據庫訂單狀態 WxPayData _returnResult = new WxPayData(); _returnResult.SetValue("return_code", "SUCCESS"); _returnResult.SetValue("return_msg", "OK"); return _returnResult.ToXml(); }