欢迎访问宙启技术站
智能推送

C#中怎么实现微信支付宝扫码支付功能

发布时间:2023-05-15 06:50:56

微信支付宝扫码支付是一种快捷、安全、便利的支付方式,得到了消费者的广泛认可和使用。本文将介绍 C# 中如何实现微信支付宝扫码支付功能。

一、前置条件

在实现微信支付宝扫码支付之前,需要注册微信和支付宝开发者账号,获取对应的支付接口信息和密钥,以及商户号和应用密钥等凭证信息。同时,需要在网站根目录下创建名为“qr”的文件夹,用于保存生成的支付二维码图片。

二、微信支付

微信支付需要调用微信支付接口,实现生成支付二维码和支付成功回调等功能。

1.生成支付二维码

①生成微信支付二维码,需要引用微信支付 SDK 支持。在 Visual Studio 中,可以使用“NuGet 包管理器”进行安装:

PM> Install-Package Senparc.Weixin.MP

②在支付前,需要使用商户的相关信息,调用微信支付 API 实现生成支付二维码,并存储到本地文件夹中。示例代码如下:

using Senparc.Weixin.MP.AdvancedAPIs;

using Senparc.Weixin.MP.AdvancedAPIs.QrCode;

using Senparc.Weixin.MP.Containers;

string appId = "微信公众账号的 AppId";

string mchId = "商户号";

string nonceStr = TenPayV3Util.GetNoncestr();

string payType = "NATIVE"; //获取支付二维码的方式:扫码支付

string body = "订单描述";

string orderNo = "欲支付的订单号";

int totalFee = 1; //单位:分

string notifyUrl = "支付回调地址"; //异步接收微信异步通知回调地址

string spbillCreateIp = "客户端 IP"; 

var dataInfo = new TenPayV3UnifiedorderRequestData(

                        appId: appId,

                        mch_id: mchId,

                        device_info: "",

                        nonce_str: nonceStr,

                        body: body,

                        detail: "详细信息",

                        attach: "附加数据",

                        out_trade_no: orderNo,

                        total_fee: totalFee,

                        spbill_create_ip: spbillCreateIp,

                        notify_url: notifyUrl,

                        trade_type: payType);

//调用接口获取预付订单号

var tenPayV3Result = TenPayV3.Unifiedorder(dataInfo);

//获取返回的微信支付二维码ticket,生成支付二维码

if (tenPayV3Result.return_code == "SUCCESS" && tenPayV3Result.result_code == "SUCCESS")

{

    string imageUrl = QrCodeApi.Create(accessToken, 3600, tenPayV3Result.code_url); 

    //生成的二维码图片地址,保存到本地

    WebClient webClinet = new WebClient();

    webClinet.DownloadFile(imageUrl, HttpContext.Current.Server.MapPath("~/qr/") + orderNo + ".jpg"); 

}

2.支付成功回调

当用户完成支付后,微信会自动回调商户的支付成功通知接口,商户需要根据微信返回的订单号和支付状态,更新订单支付状态、记录支付信息等。示例代码:

//处理微信支付回调信息

var notifyXml = new XmlDocument();

notifyXml.LoadXml(Request.InputStream);

var res = new TenPayV3Notify(notifyXml);

if (res.CheckSign() == false)

{

    return Content("签名验证失败");//若签名失败,则返回错误信息

}

switch (res.GetReturnCode())

{

    case "SUCCESS":

        string orderNo = res.GetOutTradeNo(); //获取微信返回的订单号

        //根据订单号更新订单状态,记录支付信息

        break;

    case "FAIL":

        //支付失败,对订单进行相应的处理

        break;

}

三、支付宝支付

支付宝支付需要调用支付宝开放平台 SDK,实现扫码支付和支付成功回调等功能。

1.生成支付二维码

①生成支付宝支付二维码,需要引用支付宝 SDK 支持。在 Visual Studio 中,可以使用“NuGet 包管理器”进行安装:

PM> Install-Package Alipay.AopSdk.Core

②在支付前,需要使用商户的相关信息,调用支付宝支付 API 实现生成支付二维码,并存储到本地文件夹中。示例代码如下:

using Alipay.AopSdk.AspnetCore;

using Alipay.AopSdk.Core;

using Alipay.AopSdk.Core.Request;

using Alipay.AopSdk.Core.Response;

string appId = "支付宝应用 AppId";

string privateKey = "支付宝应用私钥";

string publicKey = "支付宝公钥";

string alipayRootCertPath = ""; //根证书位置

string appCertPath = ""; //应用公钥证书位置

string appCertKey = ""; //应用公钥证书密钥

string signType = "RSA2"; //签名类型

string charset = "UTF-8"; //字符编码

string returnUrl = "同步回调地址";

string notifyUrl = "异步回调地址";

string orderNo = "欲支付的订单号";

decimal totalAmount = 0.01m; //订单金额:单位为元

string subject = "订单标题";

string qrCode = ""; //生成的支付宝支付二维码,保存到本地

try

{

    IAopClient client = new DefaultAopClient("https://openapi.alipay.com/gateway.do", appId, privateKey, "json", "1.0",

                                                    signType, publicKey, charset, alipayRootCertPath, appCertPath, appCertKey);

    AlipayTradePrecreateRequest request = new AlipayTradePrecreateRequest();

    request.SetNotifyUrl(notifyUrl);

    request.SetReturnUrl(returnUrl);

    AlipayTradePrecreateModel model = new AlipayTradePrecreateModel();

    model.OutTradeNo = orderNo;

    model.TotalAmount = totalAmount.ToString();

    model.Subject = subject;

    request.SetBizModel(model);

    AlipayTradePrecreateResponse response = client.Execute(request);

    if (response != null && response.Code == "10000")

    {

        //获取支付宝支付二维码图片地址,保存到本地

        WebClient webClinet = new WebClient();

        webClinet.DownloadFile(response.QrCode, HttpContext.Current.Server.MapPath("~/qr/") + orderNo + ".jpg");

    }

}

catch (Exception ex)

{

    throw ex;

}

2.支付成功回调

当用户完成支付后,支付宝会自动回调商户的支付成功通知接口,商户需要根据支付宝返回的订单号和支付状态,更新订单支付状态、记录支付信息等。示例代码:

//处理支付宝支付回调信息

var dict = Request.Form.ToDictionary(x => x.Key, x => x.Value.ToString());

AlipayNotify alipayNotify = new AlipayNotify(dict);

if (alipayNotify.verify())

{

    string orderNo = alipayNotify.out_trade_no; //获取支付宝返回的订单号

    //根据订单号更新订单状态,记录支付信息

}

else

{

    return Content("验证失败");//若验证失败,则返回错误信息

}

四、总结

以上就是 C# 中实现微信支付宝扫码支付的详细步骤。当然,除了以上的方式,还有其他的实现方式,比如使用第三方支付 SDK 或 API 接口等。针对不同的应用场景和需求,需要灵活运用,选择最适合的方式来实现支付功能。同时,为了保障用户的安全和隐私,商户需要合理处理用户的支付信息,严格遵循数据保护规则和安全标准,确保支付过程的顺利进行。