.NET Core 实现微信小程序支付功能(统一下单)攻略
微信小程序支付功能是一种常见的电商需求,本攻略将介绍如何使用.NET Core实现微信小程序支付功能的统一下单流程。
基本流程
微信小程序支付主要包含以下基本流程:
- 用户在小程序中选择商品并发起支付请求;
- 小程序调用开发者服务器,向后端发送订单信息;
- 开发者服务器向微信支付服务器发起统一下单请求;
- 微信支付服务器响应统一下单请求,返回预支付交易会话标识prepay_id;
- 开发者服务器向小程序返回prepay_id,小程序根据此参数调用微信支付SDK拉起支付页面;
- 用户完成支付,小程序向微信支付服务器发起支付结果查询请求,查询交易是否成功。
综上所述,微信小程序支付功能涉及到小程序、开发者服务器、微信支付服务器三方的协同配合,开发流程相对较为复杂。
下面我们将具体介绍.NET Core实现微信小程序支付功能的基本流程及代码实现。
统一下单流程
1. 安装微信支付SDK
我们需要通过NuGet安装微信支付SDK,安装命令如下:
dotnet add package Senparc.Weixin.WxOpen.dll --version 3.4.1
2. 配置微信支付相关参数
微信支付涉及到公钥、私钥、商户号、AppID等参数的配置,我们需要在appsettings.json文件中添加如下配置:
{
"WeixinPayConfig": {
"AppId": "your_app_id",
"MchId": "your_mch_id",
"Key": "your_key",
"AppSecret": "your_app_secret",
"CertPath": "your_cert_path",
"CertPassword": "your_cert_password"
}
}
3. 实现统一下单接口
我们需要在开发者服务器上实现统一下单接口,代码如下:
[HttpPost("/api/pay")]
public async Task<WeixinPayResult> PayAsync([FromBody]WeixinPayRequest request)
{
var result = await _weixinPayService.UnifiedOrderAsync(request);
return result;
}
其中,WeixinPayRequest是前端请求支付时发送给后端的参数类,包含商品名称、价格、商户订单号等信息;WeixinPayResult则是后端返回给前端的结果类,包含prepay_id、app_id、nonce_str等信息。
4. 调用微信支付SDK发起预支付交易请求
我们需要在后端实现调用微信支付SDK发起预支付交易请求的逻辑,代码如下:
public async Task<WeixinPayResult> UnifiedOrderAsync(WeixinPayRequest request)
{
var payment = new WxPayData();
payment.SetValue("body", request.Body);
payment.SetValue("out_trade_no", request.OutTradeNo);
payment.SetValue("total_fee", request.TotalFee);
payment.SetValue("trade_type", "JSAPI");
payment.SetValue("openid", request.OpenId);
var result = await WxPayApi.UnifiedOrderAsync(payment);
var nonceStr = Guid.NewGuid().ToString("N").Substring(0, 16);
var timeStamp = WxPayApi.GenerateTimeStamp();
var paySign = result.MakeSign();
var jsApiParam = new WxPayData();
jsApiParam.SetValue("appId", _weixinPayConfig.AppId);
jsApiParam.SetValue("timeStamp", timeStamp);
jsApiParam.SetValue("nonceStr", nonceStr);
jsApiParam.SetValue("package", $"prepay_id={result.GetValue("prepay_id")}");
jsApiParam.SetValue("signType", "MD5");
jsApiParam.SetValue("paySign", paySign);
return new WeixinPayResult
{
PrepayId = result.GetValue("prepay_id").ToString(),
AppId = _weixinPayConfig.AppId,
NonceStr = nonceStr,
TimeStamp = timeStamp,
SignType = "MD5",
Package = $"prepay_id={result.GetValue("prepay_id")}",
PaySign = paySign
};
}
其中,WeixinPayRequest和WeixinPayResult我们已经在之前定义过了;WxPayData和WxPayApi是微信支付SDK中的类和方法,用于封装支付请求和发送请求。
5. 拉起支付页面
我们可以在小程序中发送支付请求并处理支付结果,代码如下:
wx.request({
url: 'https://your_api_host/api/pay',
method: 'POST',
data: {
body: "测试商品",
outTradeNo: "test123",
totalFee: 1,
openId: "your_open_id"
},
success: function (res) {
wx.requestPayment({
appId: res.data.appId,
timeStamp: res.data.timeStamp,
nonceStr: res.data.nonceStr,
package: res.data.package,
signType: res.data.signType,
paySign: res.data.paySign,
success: function (result) {
console.log(result);
},
fail: function (fail) {
console.log(fail);
}
});
}
});
其中,我们在小程序中向开发者服务器发送支付请求,成功后将返回的prepay_id等参数传给SDK,拉起微信支付窗口供用户进行支付操作。
6. 查询支付结果
我们也可以在后端实现查询支付结果的逻辑,代码如下:
public async Task<WxPayData> OrderQueryAsync(string transactionId = "", string outTradeNo = "")
{
var inputObj = new WxPayData();
if (!string.IsNullOrEmpty(transactionId))
{
inputObj.SetValue("transaction_id", transactionId);
}
else
{
inputObj.SetValue("out_trade_no", outTradeNo);
}
var result = await WxPayApi.OrderQueryAsync(inputObj);
return result;
}
其中,transactionId和outTradeNo分别为微信支付服务器返回的transaction_id和商户订单号,用于查询支付结果。
示例说明
我们以CSharpWinForm开源项目作为示例进行支付功能的演示。
示例1:添加支付按钮
我们在商品详情页面添加支付按钮,一旦用户点击该按钮,将发起向开发者服务器的支付请求:
private void btnPay_Click(object sender, EventArgs e)
{
var request = new RestRequest("api/pay", Method.POST);
request.AddJsonBody(new WeixinPayRequest
{
Body = _goods.Title,
OutTradeNo = Guid.NewGuid().ToString(),
TotalFee = Convert.ToInt32(_goods.Price * 100),
OpenId = _openId
});
var response = _client.Execute<WeixinPayResult>(request);
var result = response.Data;
if (result != null)
{
var jsApiParam = new JavaScriptSerializer().Serialize(new
{
appId = result.AppId,
timeStamp = result.TimeStamp,
nonceStr = result.NonceStr,
package = result.Package,
signType = result.SignType,
paySign = result.PaySign
});
webBrowser1.Url = new Uri("https://mp.weixin.qq.com/mp/wapapp/wapapp_pay_verify.php?platform=html5&" +
"jsapi=" + jsApiParam + "&prepay_id=" + result.PrepayId + "&redirect_url=http%3a%2f%2fwww.weixin.qq.com" +
"&wxpay=true&appid=" + result.AppId + "&total_fee=" + result.TotalFee);
}
else
{
MessageBox.Show("支付失败");
}
}
示例2:查询支付结果
我们在订单详情页面添加查询支付结果按钮,一旦用户点击该按钮,将查询最新的支付结果并展示给用户:
private async void btnQuery_Click(object sender, EventArgs e)
{
var request = new RestRequest("api/pay/query", Method.POST);
request.AddJsonBody(new { transactionId = _order.TransactionId });
var response = await _client.ExecuteTaskAsync<WxPayData>(request);
var result = response.Data;
if (result != null && result.GetValue("return_code").ToString() == "SUCCESS" &&
result.GetValue("result_code").ToString() == "SUCCESS" && result.GetValue("trade_state").ToString() == "SUCCESS")
{
MessageBox.Show("支付成功");
}
else
{
MessageBox.Show("支付失败");
}
}
总结
通过本攻略的介绍,相信大家已经掌握了.NET Core实现微信小程序支付功能的基本流程及代码实现,希望对大家有所帮助。
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:.NET Core 实现微信小程序支付功能(统一下单) - Python技术站