基于C#实现微信支付宝扫码支付功能

下面是基于C#实现微信支付宝扫码支付功能的完整攻略,包含以下主要步骤:

  1. 注册微信支付宝开发者账号

首先需要在微信支付宝官网进行注册开发者账号,然后创建应用,开通扫码支付功能。在创建应用的过程中,需要填写相关商户信息,包括商户唯一标识、接口秘钥等。

  1. 配置接口参数

在获取到商户信息之后,需要对接口参数进行配置,主要包括以下信息:商户号、应用ID、应用秘钥、签名类型、支付网关、退款网关等。

具体配置方式如下:

public class WxPayConfig
{
    // 公众号Appid
    public static string APP_ID = "your_appid";
    // 公众号AppSecret
    public static string APP_SECRET = "your_appsecret";
    // 商户号
    public static string MCH_ID = "your_mch_id";
    // 商户API密钥Key
    public static string KEY = "your_key";
    // 支付成功异步通知地址
    public static string NOTIFY_URL = "your_notify_url";
    // 支付网关API
    public static string PAY_URL = "https://api.mch.weixin.qq.com/pay/unifiedorder";
}
  1. 实现支付接口

根据微信支付宝接口规范,实现扫码支付接口,包括生成订单号、生成签名、生成支付二维码等过程。

具体实现方式如下:

public class WxPayApi
{
    // 生成订单号
    public static string GenerateOutTradeNo()
    {
        string ranStr = new Random(Guid.NewGuid().GetHashCode()).Next(100000, 999999).ToString();
        string timeStamp = ((DateTime.Now.ToUniversalTime().Ticks - 621355968000000000) / 10000).ToString();
        return string.Format("{0}{1}", timeStamp, ranStr);
    }

    // 生成签名
    private static string GetSign(SortedDictionary<string, object> dict)
    {
        StringBuilder sb = new StringBuilder();
        foreach (KeyValuePair<string, object> pair in dict)
        {
            sb.Append(pair.Key);
            sb.Append("=");
            sb.Append(pair.Value);
            sb.Append("&");
        }
        sb.Append("key=");
        sb.Append(WxPayConfig.KEY);
        string sign = MD5Util.GetMD5(sb.ToString(), "utf-8").ToUpper();
        return sign;
    }

    // 生成支付二维码
    public static string GetPayQrCodeUrl(string productName, decimal totalFee)
    {
        string nonceStr = Guid.NewGuid().ToString().Replace("-", "");
        string outTradeNo = GenerateOutTradeNo();
        SortedDictionary<string, object> dict = new SortedDictionary<string, object>();
        dict.Add("appid", WxPayConfig.APP_ID);
        dict.Add("mch_id", WxPayConfig.MCH_ID);
        dict.Add("nonce_str", nonceStr);
        dict.Add("body", productName);
        dict.Add("out_trade_no", outTradeNo);
        dict.Add("total_fee", (int)(totalFee * 100));
        dict.Add("spbill_create_ip", "127.0.0.1");
        dict.Add("notify_url", WxPayConfig.NOTIFY_URL);
        dict.Add("trade_type", "NATIVE");
        dict.Add("product_id", outTradeNo);
        string sign = GetSign(dict);
        dict.Add("sign", sign);
        string xml = XmlUtil.ConvertDictToXml(dict);
        string result = HttpUtil.HttpPost(WxPayConfig.PAY_URL, xml, Encoding.UTF8);
        SortedDictionary<string, object> dictResult = XmlUtil.ConvertXmlToDict(result);
        string qrCodeUrl = dictResult["code_url"].ToString();
        return qrCodeUrl;
    }
}

public class AliPayApi
{
    // 生成订单号
    public static string GenerateOutTradeNo()
    {
        string ranStr = new Random(Guid.NewGuid().GetHashCode()).Next(100000, 999999).ToString();
        string timeStamp = ((DateTime.Now.ToUniversalTime().Ticks - 621355968000000000) / 10000).ToString();
        return string.Format("{0}{1}", timeStamp, ranStr);
    }

    // 构建签名参数
    private static SortedDictionary<string, object> BuildSignParams(string outTradeNo, string productName, decimal totalFee)
    {
        SortedDictionary<string, object> dict = new SortedDictionary<string, object>();
        dict.Add("app_id", "your_appid");
        dict.Add("method", "alipay.trade.precreate");
        dict.Add("format", "JSON");
        dict.Add("charset", "UTF-8");
        dict.Add("timestamp", DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss"));
        dict.Add("version", "1.0");
        dict.Add("notify_url", "your_notify_url");
        dict.Add("biz_content", "{\"out_trade_no\":\"" + outTradeNo + "\",\"total_amount\":\"" + totalFee.ToString("0.00") + "\",\"subject\":\"" + productName + "\"}");
        return dict;
    }

    // 生成签名
    private static string GetSign(SortedDictionary<string, object> dict)
    {
        StringBuilder sb = new StringBuilder();
        foreach (KeyValuePair<string, object> pair in dict)
        {
            if (pair.Value == null || pair.Value.ToString() == "")
            {
                continue;
            }
            sb.Append(pair.Key);
            sb.Append("=");
            sb.Append(pair.Value);
            sb.Append("&");
        }
        sb = sb.Remove(sb.Length - 1, 1);
        string sign = AlipaySignature.RSASign(sb.ToString(), "your_private_key", "UTF-8", "RSA");
        return sign;
    }

    // 生成支付二维码
    public static string GetPayQrCodeUrl(string productName, decimal totalFee)
    {
        string outTradeNo = GenerateOutTradeNo();
        SortedDictionary<string, object> dict = BuildSignParams(outTradeNo, productName, totalFee);
        string sign = GetSign(dict);
        dict.Add("sign", sign);
        string url = "https://openapi.alipay.com/gateway.do?" + HttpUtil.ConvertDictToUrlParams(dict);
        string result = HttpUtil.HttpGet(url, Encoding.UTF8);
        JObject jsonResult = JObject.Parse(result);
        string qrCodeUrl = jsonResult["alipay_trade_precreate_response"]["qr_code"].ToString();
        return qrCodeUrl;
    }
}
  1. 调用支付接口

在实现完支付接口之后,可以通过前端将产品名称、价格等信息传递给后台,然后调用支付接口生成支付二维码,最后在前端页面上展示二维码。用户通过扫码即可完成支付。

下面是两条调用示例说明:

微信支付二维码调用示例:

string qrCodeUrl = WxPayApi.GetPayQrCodeUrl("测试商品", 0.01m);

支付宝支付二维码调用示例:

string qrCodeUrl = AliPayApi.GetPayQrCodeUrl("测试商品", 0.01m);

以上就是基于C#实现微信支付宝扫码支付功能的完整攻略。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:基于C#实现微信支付宝扫码支付功能 - Python技术站

(0)
上一篇 2023年6月7日
下一篇 2023年6月7日

相关文章

  • bootstrap datetimepicker 日期插件在火狐下出现一条报错信息的原因分析及解决办法

    好的。针对 “bootstrap datetimepicker 日期插件在火狐下出现一条报错信息的原因分析及解决办法” 这个问题,需要做如下解读: 确认问题:在使用 bootstrap datetimepicker 日期插件的过程中,在火狐浏览器下会出现一条报错信息。 原因分析:bootstrap datetimepicker 日期插件基于 jQuery,它…

    C# 2023年6月1日
    00
  • C#字符串常见操作总结详解

    C#字符串常见操作总结详解 本文将为您详细介绍C#中关于字符串的常见操作,包括字符串的创建、比较、连接、替换、分割、转换等操作。 字符串的创建 在C#中,字符串可以通过以下方式创建: 字符串字面量 csharpstring str1 = “hello, world”; 使用关键字new创建字符串对象 csharpstring str2 = new strin…

    C# 2023年5月15日
    00
  • 使用Visual Studio创建ASP.NET Web API项目

    1. 创建ASP.NET Web API项目的步骤 以下是使用Visual Studio创建ASP.NET Web API项目的详细步骤: 1.1 打开Visual Studio 首先,我们需要打开Visual Studio IDE。 1.2 新建项目 点击“新建项目”按钮,选择“Web”类别,并在右侧选择“ASP.NET Web 应用程序”。 1.3 选择…

    C# 2023年6月3日
    00
  • PHP、JAVA、.NET这三种技术的区别分析

    PHP、JAVA、.NET的区别分析 PHP、JAVA、.NET是三种常见的编程技术,它们各自有着不同的特点和应用场景。以下是它们的区别分析: 1. PHP PHP是一种开源的服务器端脚本语言,它主要用于Web开发。以下是PHP的一些特点: PHP是一种解释性语言,不需要编译,可以直接在服务器上运行。 PHP支持多种数据库,包括MySQL、Oracle、Po…

    C# 2023年5月15日
    00
  • C#实现pdf导出 .Net导出pdf文件

    下面我将为你详细讲解使用C#来实现PDF导出的完整攻略。 1. 前置要求 在使用C#实现PDF导出之前,我们需要先安装一个PDF生成库。在此推荐使用iTextSharp,它是一个自由开源的PDF库,具有强大的PDF文档操作和PDF文件生成功能。你可以通过NuGet包管理器来安装iTextSharp,只需要在Visual Studio中右击项目,然后选择“管理…

    C# 2023年5月15日
    00
  • 详解ASP.NET Core中间件Middleware

    详解ASP.NET Core中间件Middleware攻略 ASP.NET Core中间件Middleware是一种用于处理HTTP请求和响应的组件。在本攻略中,我们将深入探讨ASP.NET Core中间件Middleware的工作原理,并提供两个示例说明。 中间件Middleware的工作原理 在ASP.NET Core中,中间件Middleware是一种…

    C# 2023年5月17日
    00
  • C#实现泛型List分组输出元素的方法

    下面是详细讲解“C#实现泛型List分组输出元素的方法”的完整攻略。 1. 题目背景 在 C# 中, 泛型(Generic)是指写代码时不必指定具体的类型,而是在使用时在指定类型。List 是 C# 中常用的泛型集合类型。当我们需要对一个 List 进行分组后输出元素,就需要用到泛型 List 分组的方法。 2. 泛型 List 分组的方法 2.1 Grou…

    C# 2023年6月7日
    00
  • ASP.NET Core环境变量配置和启动设置讲解

    ASP.NET Core环境变量配置和启动设置讲解 在ASP.NET Core应用程序中,环境变量和启动设置是非常重要的。本攻略将详细介绍如何在ASP.NET Core应用程序中配置环境变量和启动设置,并提供两个示例说明。 配置环境变量 在ASP.NET Core应用程序中,可以使用环境变量来配置应用程序的行为。可以按照以下步骤操作: 在appsetting…

    C# 2023年5月16日
    00
合作推广
合作推广
分享本页
返回顶部