1. 程式人生 > >.NET Core 微信小程式支付——(統一下單)

.NET Core 微信小程式支付——(統一下單)

最近公司研發了幾個電商小程式,還有一個核心的電商直播,只要是電商一般都會涉及到交易資訊,離不開支付系統,這裡我們統一實現小程式的支付流程(與服務號實現步驟一樣)。


目錄
1、開通小程式的支付能力
2、商戶後臺繫結同一主體的APPID並授權
3、預先設定回撥地址,商戶後臺設定開發的配置
4、程式碼實現統一支付5、微信支付回撥
6、總結

開通小程式的支付能力

開通小程式支付功能比較簡單,基本上按微信文件一步一步的申請就好,如圖

 

以上三個步驟就申請完成

1、提交資料給微信

2、微信稽核並簽署協議

3、商戶後臺繫結同主體的APPID

 

商戶後臺繫結同一主體的APPID並授權

1、登入商戶後臺https://pay.weixin.qq.com,進入產品中心—APPID授權管理,進入授權頁面如圖:

 

2、填寫相關已認證APPID資訊,閱讀並簽署《微信支付商戶號與APPID授權協議》,點選“確認”提交,發起授權申請,如下圖:

 

3、發起授權申請後,商戶需自行前往對應平臺確認授權申請。

小程式:前往公眾平臺,點選“微信支付-商戶號管理”,檢視相關商戶號資訊,確認授權申請,或在“公眾平臺安全助手”下發的模板訊息中確認授權資訊;

公眾號/訂閱號:前往公眾平臺,點選“微信支付-商戶號管理”,檢視相關商戶號資訊,確認授權申請;

APP:前往開放平臺,點選“管理中心-檢視-微信支付-商戶號管理”,檢視相關商戶號資訊,確認授權申請;

 

4. 以上步驟繫結成功,可以實現微信支付功能。

 

預先設定回撥地址,商戶後臺設定開發的配置

預先設定好回撥地址後,方便支付成功後收到微信通知來處理業務,設定也比較簡單不用多說,如圖:

 

根據自己的需求設定不同的回撥地址。

 

程式碼實現統一支付

1、統一支付,只要是微信公眾號平臺的同一主體都可以使用同一個支付,只需要在商戶後臺繫結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);

 

前端呼叫統一下單介面,獲取prepayId

IRegisterService register = RegisterService.Start(env, senparcSetting.Value).UseSenparcGlobal(false, null);
register.UseSenparcWeixin(senparcWeixinSetting.Value, senparcSetting.Value)
  .RegisterTenpayV3(senparcWeixinSetting.Value, "appid");

 

部分前端程式碼如下:

 

 

 

後端部分程式碼截圖獲取prepayId,如需程式碼請與我聯絡

 

提交統一支付成功後,會出現如下圖:

 

注:一般正常獲取到prepayid就可以發起支付,請確保所給的引數正確。

 

微信支付回撥

微信支付回撥規則如下:

 

回撥程式碼實現

///<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,
            };

            //回撥引數說明:https://pay.weixin.qq.com/wiki/doc/api/app/app.php?chapter=9_7&index=3
            //Logger.Info(string.Format("支付回撥接收引數成功,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,如簽名成功,微信支付成功,這時可以處理業務資料。

 

注:如果業務處理成功最好返回SUCCESS告訴微信,否則微信會隔一段時間就會回撥一次,直到回撥次數用盡,這裡也需要自己業務處理好狀態。

 

總結

以上流程就是微信支付過程,以上步驟由於一些隱私問題部分程式碼採用了截圖,如有不明白之處請與我聯絡,我們一起交流學習,下一篇文章我們將實現微信退款功能。