.NET Core 實(shí)現(xiàn)微信小程序支付功能(統(tǒng)一下單)
最近公司研發(fā)了幾個(gè)電商小程序,還有一個(gè)核心的電商直播,只要是電商一般都會(huì)涉及到交易信息,離不開(kāi)支付系統(tǒng),這里我們統(tǒng)一實(shí)現(xiàn)小程序的支付流程(與服務(wù)號(hào)實(shí)現(xiàn)步驟一樣)。
開(kāi)通小程序的支付能力
開(kāi)通小程序支付功能比較簡(jiǎn)單,基本上按微信文檔一步一步的申請(qǐng)就好,如圖
以上三個(gè)步驟就申請(qǐng)完成
1、提交資料給微信
2、微信審核并簽署協(xié)議
3、商戶后臺(tái)綁定同主體的APPID
商戶后臺(tái)綁定同一主體的APPID并授權(quán)
1、登錄商戶后臺(tái)https://pay.weixin.qq.com,進(jìn)入產(chǎn)品中心—APPID授權(quán)管理,進(jìn)入授權(quán)頁(yè)面如圖:
2、填寫(xiě)相關(guān)已認(rèn)證APPID信息,閱讀并簽署《微信支付商戶號(hào)與APPID授權(quán)協(xié)議》,點(diǎn)擊“確認(rèn)”提交,發(fā)起授權(quán)申請(qǐng),如下圖:
3、發(fā)起授權(quán)申請(qǐng)后,商戶需自行前往對(duì)應(yīng)平臺(tái)確認(rèn)授權(quán)申請(qǐng)。
小程序:前往公眾平臺(tái),點(diǎn)擊“微信支付-商戶號(hào)管理”,查看相關(guān)商戶號(hào)信息,確認(rèn)授權(quán)申請(qǐng),或在“公眾平臺(tái)安全助手”下發(fā)的模板消息中確認(rèn)授權(quán)信息;
公眾號(hào)/訂閱號(hào):前往公眾平臺(tái),點(diǎn)擊“微信支付-商戶號(hào)管理”,查看相關(guān)商戶號(hào)信息,確認(rèn)授權(quán)申請(qǐng);
APP:前往開(kāi)放平臺(tái),點(diǎn)擊“管理中心-查看-微信支付-商戶號(hào)管理”,查看相關(guān)商戶號(hào)信息,確認(rèn)授權(quán)申請(qǐng);
4. 以上步驟綁定成功,可以實(shí)現(xiàn)微信支付功能。
預(yù)先設(shè)置回調(diào)地址,商戶后臺(tái)設(shè)置開(kāi)發(fā)的配置
預(yù)先設(shè)置好回調(diào)地址后,方便支付成功后收到微信通知來(lái)處理業(yè)務(wù),設(shè)置也比較簡(jiǎn)單不用多說(shuō),如圖:
根據(jù)自己的需求設(shè)置不同的回調(diào)地址。
代碼實(shí)現(xiàn)統(tǒng)一支付
1、統(tǒng)一支付,只要是微信公眾號(hào)平臺(tái)的同一主體都可以使用同一個(gè)支付,只需要在商戶后臺(tái)綁定APPID即可。
微信小程序支付官方圖:
微信支付文檔說(shuō)明地址:https://pay.weixin.qq.com/wiki/doc/api/native.php?chapter=9_1
引用包:
Senparc.Weixin.WxOpen
Senparc.Weixin.TenPay
注冊(cè)公眾號(hào),小程序信息
services.AddSenparcGlobalServices(Configuration) .AddSenparcWeixinServices(Configuration);
前端調(diào)用統(tǒng)一下單接口,獲取prepayId
IRegisterService register = RegisterService.Start(env, senparcSetting.Value).UseSenparcGlobal(false, null); register.UseSenparcWeixin(senparcWeixinSetting.Value, senparcSetting.Value) .RegisterTenpayV3(senparcWeixinSetting.Value, "appid");
部分前端代碼如下:
后端部分代碼截圖獲取prepayId,如需代碼請(qǐng)與我聯(lián)系
提交統(tǒng)一支付成功后,會(huì)出現(xiàn)如下圖:
注:一般正常獲取到prepayid就可以發(fā)起支付,請(qǐng)確保所給的參數(shù)正確。
微信支付回調(diào)
微信支付回調(diào)規(guī)則如下:
回調(diào)代碼實(shí)現(xiàn)
///<summary> /// 微信支付回調(diào)地址 /// </summary> /// <returns></returns> [HttpPost("PayNotifyUrl")] public ActionResult PayNotifyUrl() { ResponseResult result = new ResponseResult(); ResponseHandler resHandler = new ResponseHandler(HttpContext); string return_code = resHandler.GetParameter("return_code"); string return_msg = resHandler.GetParameter("return_msg"); try { var mch_key = Senparc.Weixin.Config.SenparcWeixinSetting.TenPayV3_Key; resHandler.SetKey(mch_key); var notifyXml = resHandler.ParseXML(); bool signFlag = resHandler.IsTenpaySign(); if (signFlag && return_code.ToUpper() == "SUCCESS") { string attach = resHandler.GetParameter("attach"); string device_info = resHandler.GetParameter("device_info"); string out_trade_no = resHandler.GetParameter("out_trade_no"); string transaction_id = resHandler.GetParameter("transaction_id"); string total_fee = resHandler.GetParameter("total_fee"); PayOrderNotifyParam param = new PayOrderNotifyParam() { PayNo = out_trade_no, Attach = attach, PayPrice = decimal.Parse(total_fee) / 100, TransactionNo = transaction_id, }; //回調(diào)參數(shù)說(shuō)明:https://pay.weixin.qq.com/wiki/doc/api/app/app.php?chapter=9_7&index=3 //Logger.Info(string.Format("支付回調(diào)接收參數(shù)成功,notifyXml={0},param={1}", notifyXml, param.SerializeObject())); result = Service.PayNotifyUrl(param); if (result.errno != 0) { //回調(diào)處理邏輯失敗 Logger.Error(string.Format("支付回調(diào)處理失?。褐Ц秵翁?hào):{0},{1}", param.PayNo, result.errmsg)); } else { Logger.Info(string.Format("支付回調(diào)處理成功,支付單號(hào):{0}", param.PayNo)); string xml = string.Format(@"<xml> <return_code><![CDATA[{0}]]></return_code> <return_msg><![CDATA[{1}]]></return_msg> </xml>", return_code, return_msg); return Content(xml, "text/xml"); } } else { //錯(cuò)誤的訂單處理 Logger.Error(string.Format("支付回調(diào)接失敗,signFlag={0},notifyXml={1}", signFlag, notifyXml)); } } catch (Exception ex) { Logger.Error(string.Format("支付回調(diào)異常:Message={0},StackTrace={1}", ex.Message, ex.StackTrace)); } return Content("fail", "text/xml"); }
回調(diào)接口最好驗(yàn)證下簽名是否正確,驗(yàn)證簽名請(qǐng)先設(shè)置下商戶KEY,如簽名成功,微信支付成功,這時(shí)可以處理業(yè)務(wù)數(shù)據(jù)。
注:如果業(yè)務(wù)處理成功最好返回SUCCESS告訴微信,否則微信會(huì)隔一段時(shí)間就會(huì)回調(diào)一次,直到回調(diào)次數(shù)用盡,這里也需要自己業(yè)務(wù)處理好狀態(tài)。
總結(jié)
以上流程就是微信支付過(guò)程,以上步驟由于一些隱私問(wèn)題部分代碼采用了截圖,如有不明白之處請(qǐng)與我聯(lián)系,我們一起交流學(xué)習(xí),下一篇文章我們將實(shí)現(xiàn)微信退款功能。
以上所述是小編給大家介紹的.NET Core 實(shí)現(xiàn)微信小程序支付功能,希望對(duì)大家有所幫助,如果大家有任何疑問(wèn)請(qǐng)給我留言,小編會(huì)及時(shí)回復(fù)大家的。在此也非常感謝大家對(duì)我們網(wǎng)站的支持!
如果你覺(jué)得本文對(duì)你有幫助,歡迎轉(zhuǎn)載,煩請(qǐng)注明出處,謝謝!
上一篇:沒(méi)有了
欄 目:ASP.NET
下一篇:如何給asp.net core寫(xiě)個(gè)中間件記錄接口耗時(shí)
本文標(biāo)題:.NET Core 實(shí)現(xiàn)微信小程序支付功能(統(tǒng)一下單)
本文地址:http://mengdiqiu.com.cn/a1/ASP_NET/10881.html
您可能感興趣的文章
- 01-11如何給asp.net core寫(xiě)個(gè)簡(jiǎn)單的健康檢查
- 01-11淺析.Net Core中Json配置的自動(dòng)更新
- 01-11.net core高吞吐遠(yuǎn)程方法如何調(diào)用組件XRPC詳解
- 01-11.NET Core 遷移躺坑記續(xù)集之Win下莫名其妙的超時(shí)
- 01-11.NET開(kāi)發(fā)人員關(guān)于ML.NET的入門(mén)學(xué)習(xí)
- 01-11docker部署Asp.net core應(yīng)用的完整步驟
- 01-11.net core webapi jwt 更為清爽的認(rèn)證詳解
- 01-11ASP.NET Core靜態(tài)文件的使用方法
- 01-11.NET Core 3.0之創(chuàng)建基于Consul的Configuration擴(kuò)展組件
- 01-11.net core EF Core調(diào)用存儲(chǔ)過(guò)程的方式


閱讀排行
- 1C語(yǔ)言 while語(yǔ)句的用法詳解
- 2java 實(shí)現(xiàn)簡(jiǎn)單圣誕樹(shù)的示例代碼(圣誕
- 3利用C語(yǔ)言實(shí)現(xiàn)“百馬百擔(dān)”問(wèn)題方法
- 4C語(yǔ)言中計(jì)算正弦的相關(guān)函數(shù)總結(jié)
- 5c語(yǔ)言計(jì)算三角形面積代碼
- 6什么是 WSH(腳本宿主)的詳細(xì)解釋
- 7C++ 中隨機(jī)函數(shù)random函數(shù)的使用方法
- 8正則表達(dá)式匹配各種特殊字符
- 9C語(yǔ)言十進(jìn)制轉(zhuǎn)二進(jìn)制代碼實(shí)例
- 10C語(yǔ)言查找數(shù)組里數(shù)字重復(fù)次數(shù)的方法
本欄相關(guān)
- 01-11vscode extension插件開(kāi)發(fā)詳解
- 01-11VsCode插件開(kāi)發(fā)之插件初步通信的方法
- 01-11如何給asp.net core寫(xiě)個(gè)簡(jiǎn)單的健康檢查
- 01-11.net core高吞吐遠(yuǎn)程方法如何調(diào)用組件
- 01-11淺析.Net Core中Json配置的自動(dòng)更新
- 01-11.NET開(kāi)發(fā)人員關(guān)于ML.NET的入門(mén)學(xué)習(xí)
- 01-11.NET Core 遷移躺坑記續(xù)集之Win下莫名其
- 01-11.net core webapi jwt 更為清爽的認(rèn)證詳解
- 01-11docker部署Asp.net core應(yīng)用的完整步驟
- 01-11ASP.NET Core靜態(tài)文件的使用方法
隨機(jī)閱讀
- 08-05DEDE織夢(mèng)data目錄下的sessions文件夾有什
- 01-11ajax實(shí)現(xiàn)頁(yè)面的局部加載
- 01-10使用C語(yǔ)言求解撲克牌的順子及n個(gè)骰子
- 01-10C#中split用法實(shí)例總結(jié)
- 08-05織夢(mèng)dedecms什么時(shí)候用欄目交叉功能?
- 04-02jquery與jsp,用jquery
- 01-10SublimeText編譯C開(kāi)發(fā)環(huán)境設(shè)置
- 08-05dedecms(織夢(mèng))副欄目數(shù)量限制代碼修改
- 01-11Mac OSX 打開(kāi)原生自帶讀寫(xiě)NTFS功能(圖文
- 01-10delphi制作wav文件的方法