.Net Core 对接微信支付电商收付通

微信支付官方文档:电商收付通(二级商户进件)开发指引-文档中心-微信支付服务商平台

1.安装SDK(SKIT.FlurlHttpClient.Wechat.TenpayV3)

2.前期准备

1)APPID:服务商在公众平台申请得应用appId.

2) mchid:服务商的收款账号

3) API V3 密钥:用于平台证书解密、回调信息解密

4)API 证书序列号

5)微信支付商户 API 证书私钥(通常为 `apiclient_key.pem` 文件内容)

6)证书内容(apiclient_cert.pem 的内容)

如图

 3.写一个类,用来初始化SDK中的类(WechatTenpayClient)

 internal class WXClients
    {

         static WXClients()
        {
         
           var certificateManager = new InMemoryCertificateManager();

            WechatTenpayClientOptions options = new WechatTenpayClientOptions();
            options.MerchantId = AppConfigurtaionHelper.Configuration["WXInfoSettings:MerchantId"];
            options.MerchantV3Secret = AppConfigurtaionHelper.Configuration["WXInfoSettings:MerchantV3Secret"];
            options.MerchantCertificateSerialNumber = AppConfigurtaionHelper.Configuration["WXInfoSettings:MerchantCertificateSerialNumber"];
            options.MerchantCertificatePrivateKey = AppConfigurtaionHelper.Configuration["WXInfoSettings:MerchantCertificatePrivateKey"];
            options.PlatformCertificateManager = certificateManager;           
            options.AutoEncryptRequestSensitiveProperty = true; //直接加密请求中敏感信息字段的扩展方法

            Instance = new WechatTenpayClient(options);
        }

        //平台证书
        internal static async Task InitializeCertificateManagerAsync()
        {
            var request = new QueryCertificatesRequest();
            var response = await Instance.ExecuteQueryCertificatesAsync(request);

            response = Instance.DecryptResponseSensitiveProperty(response);
            foreach (var certificateModel in response.CertificateList)
            {
                Instance.PlatformCertificateManager.AddEntry(new CertificateEntry(certificateModel));
            }
        }

        public static readonly WechatTenpayClient Instance;
    }

4.调用(app支付列子)

  CreatePayPartnerTransactionAppRequest request = new CreatePayPartnerTransactionAppRequest();
                    request.AppId = wXInfoSettings.SP_APPID;//服务商应用ID
                    request.MerchantId = wXInfoSettings.MerchantId;//服务商户号
                    request.SubMerchantId = merInfo.ShId;//二级商户号
                   // request.SubAppId = wXInfoSettings.SP_APPID;//二级商户应用ID
                    request.Description = model.Description;//商品描述
                    request.OutTradeNumber = tranInfo.TranscationId.ToString();//商户订单号
                    request.NotifyUrl = systemSettings.Url + wXInfoSettings.PaymentnotifyUrl;  //systemSettings.Url + wXInfoSettings.PaymentnotifyUrl;//通知地址
                                                                                         //结算信息


                    CreatePayPartnerTransactionAppRequest.Types.Settlement settlement = new CreatePayPartnerTransactionAppRequest.Types.Settlement();
                    settlement.IsProfitSharing = model.YMoney > 0 ? true : false;//是否指定分账
                    if (settlement.IsProfitSharing.Value) {
                        settlement.SubsidyAmount = model.Subsidy_MoneyFen;//补差金额
                    }
                    request.Settlement = settlement;
                    //订单金额信息
                    request.Amount = new CreatePayPartnerTransactionAppRequest.Types.Amount()
                    {
                        Total =model.PayMoneyFen//订单总金额,单位为分。
                    };
                    //场景信息
                    request.Scene = new CreatePayPartnerTransactionAppRequest.Types.Scene()
                    {
                        ClientIp = model.Client_Ip // 用户终端IP
                    };

                    NLogHelper.Info("参数:" + JsonConvert.SerializeObject(request));
                    var res = await WXClients.Instance.ExecuteCreatePayPartnerTransactionAppAsync(request);
                    NLogHelper.Info("结果:" + JsonConvert.SerializeObject(res));
                    if (res.IsSuccessful()) //成功
                    {
                        var prepayId = res.PrepayId;
                        //调起支付
                        var data = WXClients.Instance.GenerateParametersForAppPayRequest(wXInfoSettings.SP_APPID, prepayId);            
                        rm.Data = data;
                        rm.State = 200;
                    }
                    else //失败
                    {
                       
                    }

5.支付成功之后接收

获取请求体

        /// <summary>
        /// 读取请求的json数据
        /// </summary>
        /// <returns></returns>
        protected async Task<string> GetRequestJsonStr()
        {
            Request.ContentType = "application/json";
            string content = string.Empty;
            using (StreamReader sr = new StreamReader(Request.Body, Encoding.UTF8))
            {
                content = await sr.ReadToEndAsync();
            }
            return content;
        }

获取请求头

    var headers = Request.Headers; 

  public async Task<ReturnModel> OrdinaryPaymentNotice(string body, IHeaderDictionary header)
        {
            ReturnModel rm = new ReturnModel();
            try
            {
            
                //验证签名
                string timestamp = header["Wechatpay-Timestamp"].ToString();//Wechatpay-Timestamp 字段
                string nonce = header["Wechatpay-Nonce"].ToString();// Wechatpay-Nonce 字段            
                string signature = header["Wechatpay-Signature"].ToString();//Wechatpay-Signature 字段
                string serialNumber =header["Wechatpay-Serial"].ToString();//Wechatpay-Serial 字段

                NLogHelper.Info($"验证签名:{timestamp} --- {nonce} ----{signature} ----{serialNumber}");

                //获取证书,根据证书验签
                await WXClients.InitializeCertificateManagerAsync();
              
                var ret = WXClients.Instance.VerifyEventSignature(timestamp, nonce, body, signature, serialNumber, out Exception error);
                if (!ret)
                {
                    rm.Msg = "签名验证失败!" + error.Message;
                    return rm;
                }

                var callbackModel = WXClients.Instance.DeserializeEvent(body);
                if ("TRANSACTION.SUCCESS".Equals(callbackModel.EventType))
                {
                    /* 根据事件类型,解密得到支付通知敏感数据 */
                    var callbackResource = WXClients.Instance.DecryptEventResource<TransactionResource>(callbackModel);
                    NLogHelper.Info("解密参数:" + JsonConvert.SerializeObject(callbackResource));
                    var  outTradeNumber = Convert.ToInt64( callbackResource.OutTradeNumber);//支付系统订单号
                    string transactionId = callbackResource.TransactionId; //微信支付订单号

                   
                    rm.State = 200;
                    rm.Data = "成功";
                }             
            }
            catch (Exception ex)
            {
                rm.Msg = ex.Message;

            }
            return rm;
        }

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
微信支付是一种非常常见的支付方式,可以用于线上和线下的交易。在.NET Core 3.1中,我们可以使用微信支付的扫码付款功能来实现支付功能。 首先,我们需要在微信支付商户平台上注册一个商户账号,并获得相应的API密钥和商户ID。 接着,在.NET Core 3.1应用程序中,我们可以使用第三方开源库,如第三方SDK,如“Senparc.Weixin”来实现与微信支付的交互。 在代码中,我们首先要引入相应的命名空间和依赖项。然后,我们可以创建一个支付请求对象,包括必要的参数,如订单号、金额、商品信息等。 接下来,我们可以使用微信支付提供的API,生成一个支付二维码,并将其展示给用户。用户可以使用微信扫描这个二维码来完成支付。 在用户完成支付后,微信支付会向我们提供一个支付结果知。我们可以在.NET Core 3.1应用程序中编写一个接收支付结果知的接口,并对接收到的知进行验证和处理。根据支付结果,我们可以更新订单状态,完成支付流程。 另外,为了保证支付的安全性,我们还需要进行签名和加密操作,以确保支付请求和结果在传输过程中不被篡改。在.NET Core 3.1中,我们可以使用相应的加密算法和方法来对数据进行加密和解密。 总结来说,过在.NET Core 3.1应用程序中使用微信支付的扫码付款功能,我们可以实现一个简单的支付功能,同时保证支付的安全性和可靠性。
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值