ASP.NET中JSAPI的工作原理是什么?

微信支付JSAPI集成与ASP.NET实现详解

ASP.NET中JSAPI的工作原理是什么?

一、前言

在现代电子商务和在线交易中,微信支付已经成为一种非常流行的支付方式,微信提供了多种支付方式,其中JSAPI支付是一种用于网页端的支付方式,主要应用于电商网站和服务类网站的在线支付场景,本文将详细介绍如何在ASP.NET环境中集成微信支付JSAPI,并提供完整的代码示例和相关说明。

二、微信支付JSAPI简介

什么是微信支付JSAPI

微信支付JSAPI是微信官方提供的一种网页支付接口,主要用于在微信浏览器内完成支付操作,用户在微信中打开商家的H5页面,通过调用微信支付提供的JSAPI接口调起微信支付模块完成支付。

微信支付方式介绍

微信提供了多种支付方式,适用于不同的支付场景:

刷卡支付:用户展示微信钱包内的“刷卡条码/二维码”给商户系统扫描后直接完成支付,适用于线下面对面收银的场景。

扫码支付:商户系统按微信支付协议生成支付二维码,用户再用微信“扫一扫”完成支付,适用于PC网站支付、实体店单品或订单支付、媒体广告支付等场景。

公众号支付:用户在微信中打开商户的H5页面,通过调用微信支付提供的JSAPI接口调起微信支付模块完成支付,适用于电商网站和服务类网站的在线交易场景。

APP支付:又称移动端支付,是商户通过在移动端应用APP中集成开放SDK调起微信支付模块完成支付的模式。

H5支付:用于在手机端微信外浏览器进行支付,但在微信内不能使用。

三、前期准备

开通微信支付功能

在进行微信支付开发之前,需要确保已经在微信支付商户平台开通了微信支付功能,并获取到相应的商户号和AppID。

ASP.NET中JSAPI的工作原理是什么?

创建JSAPI支付应用

在微信支付商户平台创建一个JSAPI支付的应用,并获取到相应的AppID和AppSecret。

安装.NET开发环境

确保已经安装了.NET开发环境,例如Visual Studio。

引入SDK

通过NuGet包管理器或手动下载和引用DLL文件的方式,将以下两个SDK引入到项目中:

Senparc.Weixin.MP.Core:用于处理微信JSAPI支付相关的逻辑。

Senparc.Weixin.MP.TenPay:用于处理微信支付相关的逻辑。

四、配置支付参数

在ASP.NET项目中,需要配置一些支付相关的参数,这些参数可以保存在配置文件中,或者直接在代码中进行硬编码,以下是一些常用的支付参数:

string appId = "yourAppId";
string mchId = "yourMchId";
string key = "yourKey";
string notifyUrl = "https://yourdomain.com/pay/notify";

五、项目结构说明

现在大多数公司项目都使用.NET Core框架,并且用到仓储Repository需要在Startup中绑定服务,并注入微信公众号支付的相关服务。

配置支付授权目录

在微信商户平台的产品中心->开发配置->公众号支付->支付授权目录中,配置好域名,这个目录是用来获取用户的openid及用户信息的。

配置网页授权获取用户基本信息接口

在微信公众平台的公众号设置->网页授权域名、JS安全域名中进行配置,这个配置的作用是使你能访问到支付的接口及回调页面能够返回,其中的域名必须是备案的。

六、前端页面调起支付

ASP.NET中JSAPI的工作原理是什么?

前端页面需要通过点击支付按钮调支付的接口,在支付接口中调用统一下单,获得下单结果,从统一下单成功返回的数据中获取微信浏览器调起jsapi支付所需的参数,前端页面拿到参数唤起微信支付,支付成功后返回ok,前端可以处理其他的跳转操作。

以下是一个简单的前端页面示例:

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>微信支付样例-JSAPI支付</title>
    <script type="text/javascript">
        function callpay() {
            if (typeof WeixinJSBridge == "undefined") {
                if (document.addEventListener) {
                    document.addEventListener('WeixinJSBridgeReady', onBridgeReady, false);
                } else if (document.attachEvent) {
                    document.attachEvent('WeixinJSBridgeReady', onBridgeReady);
                    document.attachEvent('onWeixinJSBridgeReady', onBridgeReady);
                }
            } else {
                onBridgeReady();
            }
        }
        function onBridgeReady() {
            WeixinJSBridge.invoke(
                'getBrandWCPayRequest', {
                    "appId": "<%=appId%>",     //公众号名称,由商户传入     
                    "timeStamp": "<%=timeStamp%>", //时间戳,自1970年以来的秒数     
                    "nonceStr": "<%=nonceStr%>", //随机串
                    "package": "<%=packageValue%>", //统一下单接口返回的prepay_id参数值,提交格式如:prepay_id=***)
                    "signType": "MD5",         //微信签名方式:
                    "paySign": "<%=paySign%>" //微信签名
                },
                function (res) {
                    WeixinJSBridge.log(res.err_msg);
                    alert(res.err_code + res.err_desc + res.err_msg);
                }       
            );
        }
    </script>
</head>
<body>
    <form id="form1" runat="server">
        <div>
            <asp:Button ID="submit" runat="server" Text="立即支付" OnClientClick="callpay()" style="width:210px; height:50px; border-radius: 15px;background-color:#00CD00; border:0px #FE6714 solid; cursor: pointer;  color:white;  font-size:16px;" />
        </div>
    </form>
</body>
</html>

七、后台生成支付参数

后台需要生成支付参数,包括时间戳、随机串、统一下单接口返回的prepay_id参数值以及签名等,以下是一个简单的后台代码示例:

public ActionResult GenerateOrder([FromBody]OrderInfo orderInfo)
{
    try
    {
        // 1. 统一下单,获取预付订单
        var result = UnifiedOrder(orderInfo);
        if (result.ReturnCode != "SUCCESS")
        {
            return Content("Error");
        }
        // 2. 获取微信分配的预支付交易会话标识
        string prepayId = result.PrepayId;
        string timeStamp = result.TimeStamp;
        string nonceStr = result.NonceStr;
        string packages = "prepay_id=" + prepayId;
        string paySign = GeneratePaySign(appId, prepayId, nonceStr, timeStamp);
        // 3. 返回给前端页面的参数
        var parameters = new
        {
            appId = appId,
            timeStamp = timeStamp,
            nonceStr = nonceStr,
            packages = packages,
            signType = "MD5",
            paySign = paySign,
        };
        return Json(parameters);
    }
    catch (Exception ex)
    {
        return Content("Error");
    }
}

八、常见问题与解决方案

如何获取用户的openid?

答:在微信公众平台的公众号设置->网页授权域名、JS安全域名中进行配置,这个配置的作用是使你能访问到支付的接口及回调页面能够返回,其中的域名必须是备案的,然后通过前端页面获取用户的code,再通过后端接口获取用户的openid。

2. 如何解决微信支付提示“当前页面的URL未注册”?

答:这个问题通常是由于支付授权目录配置不正确导致的,请确保在微信商户平台的产品中心->开发配置->公众号支付->支付授权目录中配置正确的域名。

以上就是关于“asp.net jsapi”的问题,朋友们可以点击主页了解更多内容,希望可以够帮助大家!