欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

.NET Core 实现微信小程序支付功能(统一下单)

程序员文章站 2022-09-04 13:45:23
最近公司研发了几个电商小程序,还有一个核心的电商直播,只要是电商一般都会涉及到交易信息,离不开支付系统,这里我们统一实现小程序的支付流程(与服务号实现步骤一样)。 开通小程序的支付能...

最近公司研发了几个电商小程序,还有一个核心的电商直播,只要是电商一般都会涉及到交易信息,离不开支付系统,这里我们统一实现小程序的支付流程(与服务号实现步骤一样)。

开通小程序的支付能力

开通小程序支付功能比较简单,基本上按微信文档一步一步的申请就好,如图

.NET Core 实现微信小程序支付功能(统一下单)

以上三个步骤就申请完成

1、提交资料给微信

2、微信审核并签署协议

3、商户后台绑定同主体的appid

商户后台绑定同一主体的appid并授权

1、登录商户后台https://pay.weixin.qq.com,进入产品中心—appid授权管理,进入授权页面如图:

.NET Core 实现微信小程序支付功能(统一下单)

2、填写相关已认证appid信息,阅读并签署《微信支付商户号与appid授权协议》,点击“确认”提交,发起授权申请,如下图:

.NET Core 实现微信小程序支付功能(统一下单)

3、发起授权申请后,商户需自行前往对应平台确认授权申请。

小程序:前往公众平台,点击“微信支付-商户号管理”,查看相关商户号信息,确认授权申请,或在“公众平台安全助手”下发的模板消息中确认授权信息;

公众号/订阅号:前往公众平台,点击“微信支付-商户号管理”,查看相关商户号信息,确认授权申请;

app:前往开放平台,点击“管理中心-查看-微信支付-商户号管理”,查看相关商户号信息,确认授权申请;

.NET Core 实现微信小程序支付功能(统一下单)

4. 以上步骤绑定成功,可以实现微信支付功能。

预先设置回调地址,商户后台设置开发的配置

预先设置好回调地址后,方便支付成功后收到微信通知来处理业务,设置也比较简单不用多说,如图:

.NET Core 实现微信小程序支付功能(统一下单)

根据自己的需求设置不同的回调地址。

代码实现统一支付

1、统一支付,只要是微信公众号平台的同一主体都可以使用同一个支付,只需要在商户后台绑定appid即可。

微信小程序支付官方图:

.NET Core 实现微信小程序支付功能(统一下单)

微信支付文档说明地址: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");

部分前端代码如下:

.NET Core 实现微信小程序支付功能(统一下单)

.NET Core 实现微信小程序支付功能(统一下单)

后端部分代码截图获取prepayid,如需代码请与我联系

.NET Core 实现微信小程序支付功能(统一下单)

提交统一支付成功后,会出现如下图:

.NET Core 实现微信小程序支付功能(统一下单)

注:一般正常获取到prepayid就可以发起支付,请确保所给的参数正确。

微信支付回调

微信支付回调规则如下:

.NET Core 实现微信小程序支付功能(统一下单)

回调代码实现

///<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告诉微信,否则微信会隔一段时间就会回调一次,直到回调次数用尽,这里也需要自己业务处理好状态。

总结

以上流程就是微信支付过程,以上步骤由于一些隐私问题部分代码采用了截图,如有不明白之处请与我联系,我们一起交流学习,下一篇文章我们将实现微信退款功能。

以上所述是小编给大家介绍的.net core 实现微信小程序支付功能,希望对大家有所帮助