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

yizhihongxing

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

微信小程序支付功能是一种常见的电商需求,本攻略将介绍如何使用.NET Core实现微信小程序支付功能的统一下单流程。

基本流程

微信小程序支付主要包含以下基本流程:

  1. 用户在小程序中选择商品并发起支付请求;
  2. 小程序调用开发者服务器,向后端发送订单信息;
  3. 开发者服务器向微信支付服务器发起统一下单请求;
  4. 微信支付服务器响应统一下单请求,返回预支付交易会话标识prepay_id;
  5. 开发者服务器向小程序返回prepay_id,小程序根据此参数调用微信支付SDK拉起支付页面;
  6. 用户完成支付,小程序向微信支付服务器发起支付结果查询请求,查询交易是否成功。

综上所述,微信小程序支付功能涉及到小程序、开发者服务器、微信支付服务器三方的协同配合,开发流程相对较为复杂。

下面我们将具体介绍.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技术站

(0)
上一篇 2023年5月30日
下一篇 2023年5月30日

相关文章

  • php unlink()函数使用教程

    下面是详细讲解 PHP unlink() 函数使用教程的完整攻略。 1. 什么是PHP unlink()函数 PHP unlink() 函数用于删除文件,它的基本语法如下: bool unlink ( string $filename [, resource $context ] ) 其中,$filename 参数表示要删除的文件路径及文件名,$contex…

    PHP 2023年5月27日
    00
  • Laravel 5框架学习之向视图传送数据(进阶篇)

    Laravel是一种流行的PHP Web开发框架。使用Laravel可以高效地构建Web应用程序。 在Laravel中,视图是展示数据的一种方法。在此处,我们将讲解一些向视图传递数据的方法。 1.使用数组向视图传递数据 使用Laravel向视图传递数据的最基本方法是将数据存储在数组中,然后将该数组传递给视图。以下是一个简单的示例,展示如何向视图传递数组: p…

    PHP 2023年5月23日
    00
  • php调用shell的方法

    下面是关于“php调用shell的方法”的详细攻略。 什么是shell Shell是计算机操作系统中一个命令行界面程序,它接收用户输入的命令,然后将其转换成操作系统能识别的指令,并交由内核处理。在本文中,我们主要关注的是Linux和Unix操作系统中的shell。 php如何调用shell命令 在PHP中可以通过调用系统命令来执行shell操作,常见的调用方…

    PHP 2023年5月23日
    00
  • php实现微信和支付宝支付的示例代码

    下面是PHP实现微信和支付宝支付的示例代码的完整攻略。 一、微信支付 1. 获取微信支付相关信息 1.1. 微信支付功能准备 在开始使用微信支付之前,需要开通微信支付的相关功能,具体流程如下: 注册成为微信商户,https://pay.weixin.qq.com/index.php/core/home/login?return_url=%2Findex.ph…

    PHP 2023年5月23日
    00
  • php使用explode()函数将字符串拆分成数组的方法

    当我们需要将一个字符串按照特定的字符或者字符串进行拆分时,PHP的内置函数explode()可以很好的满足我们的需求。下面是介绍如何使用explode()函数将字符串拆分成数组的完整攻略。 1. 函数定义 explode()函数用于将一个字符串分割成数组。其语法为: array explode ( string $delimiter , string $st…

    PHP 2023年5月26日
    00
  • PHP 5.0创建图形的实用方法完整篇

    感谢您对本网站的关注和支持。以下是关于“PHP 5.0创建图形的实用方法完整篇”的完整攻略: PHP 5.0创建图形的实用方法完整篇 简介 在PHP 5.0中,我们可以使用GD库来创建各种图形。GD库是一个开源的PHP插件,可以动态地生成JPEG、PNG、GIF格式的图像。在本篇攻略中,我们将会讲解如何使用PHP 5.0和GD库来创建图形。 安装GD库 在使…

    PHP 2023年5月30日
    00
  • 深思 PHP 数组遍历的差异(array_diff 的实现)

    深思 PHP 数组遍历的差异 在 PHP 语言中,对于数组的操作与遍历是比较常见的操作,其中 array_diff 函数是常用的在两个数组之间取出差集的函数之一。但是这个函数的实现却有些不太一样,下面我们来探究一下。 array_diff 示例 $arr1 = [‘a’, ‘b’, ‘c’, ‘d’]; $arr2 = [‘b’, ‘c’, ‘e’]; $r…

    PHP 2023年5月26日
    00
  • PHP实现数据库的增删查改功能及完整代码

    下面我将为您详细讲解如何使用PHP实现数据库的增删查改功能,并附上完整的代码。 前置条件 在进行下面的操作前,需要满足以下前置条件: 已安装PHP和MySQL,并能够相互通信。 已创建数据库和数据表,并拥有对它们的操作权限。 增加数据 要向数据库中添加新数据,需要使用INSERT INTO语句。以下是示例代码: <?php $host = "…

    PHP 2023年5月24日
    00
合作推广
合作推广
分享本页
返回顶部