.NET Core 實現(xiàn)微信小程序支付功能(統(tǒng)一下單)
最近公司研發(fā)了幾個電商小程序,還有一個核心的電商直播,只要是電商一般都會涉及到交易信息,離不開支付系統(tǒng),這里我們統(tǒng)一實現(xiàn)小程序的支付流程(與服務號實現(xiàn)步驟一樣)。
開通小程序的支付能力
開通小程序支付功能比較簡單,基本上按微信文檔一步一步的申請就好,如圖

以上三個步驟就申請完成
1、提交資料給微信
2、微信審核并簽署協(xié)議
3、商戶后臺綁定同主體的APPID
商戶后臺綁定同一主體的APPID并授權
1、登錄商戶后臺https://pay.weixin.qq.com,進入產(chǎn)品中心—APPID授權管理,進入授權頁面如圖:

2、填寫相關已認證APPID信息,閱讀并簽署《微信支付商戶號與APPID授權協(xié)議》,點擊“確認”提交,發(fā)起授權申請,如下圖:

3、發(fā)起授權申請后,商戶需自行前往對應平臺確認授權申請。
小程序:前往公眾平臺,點擊“微信支付-商戶號管理”,查看相關商戶號信息,確認授權申請,或在“公眾平臺安全助手”下發(fā)的模板消息中確認授權信息;
公眾號/訂閱號:前往公眾平臺,點擊“微信支付-商戶號管理”,查看相關商戶號信息,確認授權申請;
APP:前往開放平臺,點擊“管理中心-查看-微信支付-商戶號管理”,查看相關商戶號信息,確認授權申請;

4. 以上步驟綁定成功,可以實現(xiàn)微信支付功能。
預先設置回調地址,商戶后臺設置開發(fā)的配置
預先設置好回調地址后,方便支付成功后收到微信通知來處理業(yè)務,設置也比較簡單不用多說,如圖:

根據(jù)自己的需求設置不同的回調地址。
代碼實現(xiàn)統(tǒng)一支付
1、統(tǒng)一支付,只要是微信公眾號平臺的同一主體都可以使用同一個支付,只需要在商戶后臺綁定APPID即可。
微信小程序支付官方圖:

微信支付文檔說明地址:https://pay.weixin.qq.com/wiki/doc/api/native.php?chapter=9_1
引用包:
Senparc.Weixin.WxOpen
Senparc.Weixin.TenPay
注冊公眾號,小程序信息
services.AddSenparcGlobalServices(Configuration) .AddSenparcWeixinServices(Configuration);
前端調用統(tǒng)一下單接口,獲取prepayId
IRegisterService register = RegisterService.Start(env, senparcSetting.Value).UseSenparcGlobal(false, null); register.UseSenparcWeixin(senparcWeixinSetting.Value, senparcSetting.Value) .RegisterTenpayV3(senparcWeixinSetting.Value, "appid");
部分前端代碼如下:


后端部分代碼截圖獲取prepayId,如需代碼請與我聯(lián)系

提交統(tǒng)一支付成功后,會出現(xiàn)如下圖:

注:一般正常獲取到prepayid就可以發(fā)起支付,請確保所給的參數(shù)正確。
微信支付回調
微信支付回調規(guī)則如下:

回調代碼實現(xiàn)
///<summary>
/// 微信支付回調地址
/// </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,
};
//回調參數(shù)說明:https://pay.weixin.qq.com/wiki/doc/api/app/app.php?chapter=9_7&index=3
//Logger.Info(string.Format("支付回調接收參數(shù)成功,notifyXml={0},param={1}", notifyXml, param.SerializeObject()));
result = Service.PayNotifyUrl(param);
if (result.errno != 0)
{
//回調處理邏輯失敗
Logger.Error(string.Format("支付回調處理失?。褐Ц秵翁?{0},{1}", param.PayNo, result.errmsg));
}
else
{
Logger.Info(string.Format("支付回調處理成功,支付單號:{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
{
//錯誤的訂單處理
Logger.Error(string.Format("支付回調接失敗,signFlag={0},notifyXml={1}", signFlag, notifyXml));
}
}
catch (Exception ex)
{
Logger.Error(string.Format("支付回調異常:Message={0},StackTrace={1}", ex.Message, ex.StackTrace));
}
return Content("fail", "text/xml");
}
回調接口最好驗證下簽名是否正確,驗證簽名請先設置下商戶KEY,如簽名成功,微信支付成功,這時可以處理業(yè)務數(shù)據(jù)。
注:如果業(yè)務處理成功最好返回SUCCESS告訴微信,否則微信會隔一段時間就會回調一次,直到回調次數(shù)用盡,這里也需要自己業(yè)務處理好狀態(tài)。
總結
以上流程就是微信支付過程,以上步驟由于一些隱私問題部分代碼采用了截圖,如有不明白之處請與我聯(lián)系,我們一起交流學習,下一篇文章我們將實現(xiàn)微信退款功能。
以上所述是小編給大家介紹的.NET Core 實現(xiàn)微信小程序支付功能,希望對大家有所幫助,如果大家有任何疑問請給我留言,小編會及時回復大家的。在此也非常感謝大家對腳本之家網(wǎng)站的支持!
如果你覺得本文對你有幫助,歡迎轉載,煩請注明出處,謝謝!
相關文章
asp.net core3.1 引用的元包dll版本兼容性問題解決方案
這篇文章主要介紹了asp.net core 3.1 引用的元包dll版本兼容性問題解決方案,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧2020-03-03
比較簡單的將數(shù)據(jù)信息導入wrod文檔方案(C# for word)
史上最簡單將數(shù)據(jù)信息導入wrod文檔方案(C# for word)2010-01-01
.net core 靜態(tài)類獲取appsettings的方法
這篇文章主要介紹了.net core 靜態(tài)類獲取appsettings的方法,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧2020-06-06
創(chuàng)建基于ASP.NET的SMTP郵件服務的具體方法
Asp.net在System.Web.Mail名稱空間中有一個發(fā)送email的內建類,但這僅是cdosys的一個假象。開發(fā)者能使用一個替代的它smtp郵件服務。在這篇文章里面,我將會展示如何創(chuàng)建一個用于asp.net的功能齊全的smtp郵件服務2013-11-11
為ASP.NET MVC及WebApi添加路由優(yōu)先級
這是一個對Asp.Net Mvc的一個很小的功能拓展,小項目可能不太需要這個功能,但有時候項目大了注冊的路由不生效時你應該要想到有可能是因為路由順序的原因,這時這個路由優(yōu)先級的功能有可能就會給你帶來便利。2015-10-10
ASP.NET Core中調整HTTP請求大小的幾種方法詳解
這篇文章主要給大家介紹了關于在ASP.NET Core中如何調整HTTP請求大小的幾種方法,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧。2017-12-12

