基于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日

相关文章

  • C#笔记之EF Code First 数据模型 数据迁移

    C#笔记之EF Code First 数据模型 数据迁移 在使用.NET Core进行开发时,EF Code First被广泛用作ORM框架,在应用程序开发的不同阶段,会涉及到数据模型的改变,而EF Code First提供了一些工具来管理数据迁移,下面将介绍如何进行EF Code First数据模型的创建、数据迁移的方法和注意点。 创建数据模型 新建项目 …

    C# 2023年6月1日
    00
  • .Net Core读取文件时中文乱码问题的解决方法分享

    .NET Core读取文件时中文乱码问题的解决方法分享 在.NET Core中,读取文件时中文乱码是一个常见的问题。在本攻略中,我们将详细讲解.NET Core读取文件时中文乱码问题的解决方法,并提供两个示例说明。 步骤一:使用正确的编码方式读取文件 在.NET Core中,您需要使用正确的编码方式读取文件,以避免中文乱码问题。以下是使用正确的编码方式读取文…

    C# 2023年5月17日
    00
  • Asp.net操作Excel更轻松的实现代码

    Asp.net操作Excel更轻松的实现代码 在Asp.net中,操作Excel文件的需求比较常见,而通过使用第三方库和相关命名空间中的类,可以更轻松地实现对Excel文件的读取和写入操作。 第一步:安装Nuget包 我们需要安装一个Nuget包来实现对Excel的操作,这个Nuget包就是EPPlus,它是一个免费的开源项目,支持2007和2010版本的E…

    C# 2023年5月31日
    00
  • C#中ref和out的区别浅析

    C#中ref和out的区别浅析 简介 在C#中,关键字ref和out用于传递参数。尽管两个关键字都可以使用相同的参数来传递值,但它们在应用和使用上还是有一些区别,下面进行一一讲解。 ref关键字 ref关键字用于将参数传递给函数并且函数可以修改传递的参数,同时最初传递的参数也会被修改。这里要注意的是,在使用ref关键字时,必须要在通过ref来初始化变量(即在…

    C# 2023年5月15日
    00
  • C#表达式树Expression动态创建表达式

    本文将会介绍C#表达式树(Expression)动态创建表达式的完整攻略,包括表达式树的基本概念、表达式树的创建、表达式树的编译以及完整的示例说明。 表达式树的基本概念 表达式树是一个由操作符和操作数组成的树状结构,是一种可以在运行时动态创建表达式的机制。在C#中,表达式树是由Expression命名空间中的类和枚举所组成,它们提供了创建和操作表达式树的方法…

    C# 2023年5月31日
    00
  • C#操作windows系统进程的方法

    C#操作windows系统进程的方法 在C#中,我们可以使用Process类来控制和操作Windows系统的进程。 如何启动一个进程? 我们可以使用Process.Start()方法来启动一个新的进程。该方法有多个重载形式,其中最常用的形式是传递进程的可执行文件的完整路径或者文件名,可以带上其它参数,可见以下示例: Process.Start("n…

    C# 2023年6月7日
    00
  • C# Linq的OfType()方法 – 返回序列中指定类型的元素

    下面是C# Linq的OfType()方法的详细讲解: C# Linq OfType() 方法的作用 C# Linq OfType() 方法是用于从集合中筛选出具有指定类型的元素的方法。在某些情况下,我们需要从一个集合中仅仅保留某一种类型的元素,这时我们就可以使用 OfType() 方法。 OfType() 方法可以作用于任何实现了 IEnumerable(…

    C# 2023年4月19日
    00
  • ASP.NET MVC缓存过滤器用法

    ASP.NET MVC缓存过滤器是一种用于提高应用程序性能的技术。它通过将数据存储在内存中,避免了每次请求都要到数据源进行查询的过程,从而缩短了网页响应时间,增加了用户体验。以下是ASP.NET MVC缓存过滤器用法的完整攻略: 1. 缓存过滤器的工作原理 MVC中的缓存过滤器通过使用 OutputCacheAttribute 属性来控制哪些action或者…

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