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

.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 header函数使用教程

    下面是“分享PHP header函数使用教程”的完整攻略: 一、什么是header函数 header() 函数是一个实用的 PHP 函数,它向客户端发送原始的 HTTP 报头。此函数用于控制网页缓存信息,文件下载等内容。 二、header函数的语法 header() 函数的语法如下: header(string, replace, http_response…

    PHP 2023年5月26日
    00
  • 基于Swoole实现PHP与websocket聊天室

    下面是“基于Swoole实现PHP与websocket聊天室”的完整攻略。 什么是Swoole Swoole是一个可以实现异步、高并发、高性能网络通信和异步IO的PHP扩展,可用于创建Web服务器、WebSocket服务器、TCP/UDP服务器等应用。使用Swoole可以实现PHP应用的高并发和高性能,特别是在处理大量的IO事件的时候,具有出色的性能表现和高…

    PHP 2023年5月27日
    00
  • 编写Smarty插件在模板中直接加载数据的详细介绍

    编写Smarty插件可以方便在模板中直接加载数据,下面是具体的攻略: 步骤一:创建插件 在Smarty的plugins目录中创建一个新文件,以“插件名.plugin.php”的格式命名。比如,我们要创建一个名为“myplugin”的插件,就可以在plugins目录中创建一个myplugin.plugin.php的文件。 步骤二:编写插件代码 在myplugi…

    PHP 2023年5月26日
    00
  • php编程实现简单的网页版计算器功能示例

    我来为你详细讲解如何用 PHP 编写一个简单的网页版计算器功能。 前置知识 在开始之前,你需要了解以下前置知识: HTML 基础知识:了解 HTML 的基础结构、元素和属性。 PHP 基础知识:了解 PHP 的基础语法和函数。 实现步骤 1. 创建 HTML 页面结构 首先,我们需要创建一个 HTML 页面,包含一个表单元素和一个提交按钮,用于输入和计算两个…

    PHP 2023年5月26日
    00
  • PHP实现爬虫爬取图片代码实例

    下面是详细讲解: PHP实现爬虫爬取图片代码实例 什么是爬虫? 爬虫(Crawler)是指一种能够按照一定规则自动抓取互联网上信息的程序,也称为网络蜘蛛(Spider)。通俗的理解是自动抓取网页内容并进行处理的程序。 爬虫的基本流程 发起请求 解析网页内容 保存数据 实现步骤 爬虫请求 使用 PHP 的 CURL 函数库来发起请求: $ch = curl_i…

    PHP 2023年5月27日
    00
  • 分析JS单线程异步io回调的特性

    分析 JS 单线程异步 IO 回调的特性可以从以下几个方面进行: 单线程 JavaScript 是一门单线程语言,它从设计之初就决定了在同一时刻只能执行一个程序代码块。这意味着当代码被执行的时候,只有一个调用栈。当一段程序被执行的时候,它会依次进入调用栈中。当某个函数被执行时,它也会进入调用栈中。当该函数执行结束时,它会从调用栈中弹出。这样在业务逻辑上就很难…

    PHP 2023年5月27日
    00
  • PHP写杨辉三角实例代码

    让我们来讲解一下如何用PHP编写杨辉三角的实例代码吧。 背景介绍 杨辉三角又叫帕斯卡三角,它是由中国宋朝数学家杨辉在13世纪发现的。杨辉三角是一个数列,由上往下逐渐增加,且每一行的数字都是上一行相邻两数之和。杨辉三角可以产生很多神奇的数学现象,比如质数规律等等。 分析与代码实现 在这个实例中,我们将用PHP语言编写一个杨辉三角,输出10行数字的杨辉三角。 我…

    PHP 2023年5月23日
    00
  • PHP字符串中抽取子串操作实例分析

    针对“PHP字符串中抽取子串操作实例分析”,以下是完整攻略。 什么是子串 子串(sub string)指的是字符串中的一部分。在PHP中,我们可以通过指定开始位置和长度,从一个字符串中抽取出指定的子串。 如何抽取子串 在PHP中,我们可以使用substr函数来抽取子串。substr函数的语法为: substr(string $string, int $sta…

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