简洁易懂的微信支付与支付宝支付接口对接示例

新手开箱即用,有疑问可留言!

在现代的互联网应用中,集成微信支付和支付宝支付是十分常见的需求。本文将简要介绍如何在.NET Core项目中对接微信支付和支付宝支付接口,提供直接可用的代码示例,并强调一些关键注意事项。


一、微信支付接口对接示例

1.1 前提准备

在对接微信支付接口前,需要准备以下内容:

  • 微信支付商户号及API密钥。
  • 微信支付接口证书文件(可选,视接口要求而定)。
  • .NET Core项目中安装 HttpClient
1.2 微信支付示例代码

以下代码示例展示了如何通过.NET Core项目发起一个简单的微信支付请求:

using System;
using System.Net.Http;
using System.Security.Cryptography;
using System.Text;
using System.Threading.Tasks;
using System.Xml.Linq;

namespace WeChatPayExample
{
    class Program
    {
        static async Task Main(string[] args)
        {
            // 微信支付的基本信息
            string appId = "你的微信AppID";
            string mchId = "你的商户号";
            string apiKey = "你的API密钥";
            string notifyUrl = "https://你的回调地址"; // 支付成功后的回调地址
            string outTradeNo = DateTime.Now.Ticks.ToString(); // 生成唯一的订单号
            string totalFee = "100"; // 支付金额,单位为分(1元=100分)
            string body = "商品描述"; // 商品描述
            string spbillCreateIp = "用户的IP地址";

            // 构建支付请求的参数
            var parameters = new SortedDictionary<string, string>
            {
                { "appid", appId },
                { "mch_id", mchId },
                { "nonce_str", Guid.NewGuid().ToString("N") }, // 随机字符串
                { "body", body },
                { "out_trade_no", outTradeNo },
                { "total_fee", totalFee },
                { "spbill_create_ip", spbillCreateIp },
                { "notify_url", notifyUrl },
                { "trade_type", "NATIVE" } // 扫码支付类型
            };

            // 签名生成
            string sign = CreateSign(parameters, apiKey);
            parameters.Add("sign", sign);

            // 构建XML格式的请求数据
            var requestXml = new XElement("xml",
                new XElement("appid", appId),
                new XElement("mch_id", mchId),
                new XElement("nonce_str", parameters["nonce_str"]),
                new XElement("sign", sign),
                new XElement("body", body),
                new XElement("out_trade_no", outTradeNo),
                new XElement("total_fee", totalFee),
                new XElement("spbill_create_ip", spbillCreateIp),
                new XElement("notify_url", notifyUrl),
                new XElement("trade_type", "NATIVE")
            );

            using var client = new HttpClient();
            var content = new StringContent(requestXml.ToString(), Encoding.UTF8, "application/xml");

            // 发送支付请求
            var response = await client.PostAsync("https://api.mch.weixin.qq.com/pay/unifiedorder", content);
            string responseXml = await response.Content.ReadAsStringAsync();

            // 处理响应结果
            var responseDoc = XDocument.Parse(responseXml);
            var returnCode = responseDoc.Root.Element("return_code").Value;
            if (returnCode == "SUCCESS")
            {
                // 支付请求成功,解析支付URL
                var codeUrl = responseDoc.Root.Element("code_url").Value;
                Console.WriteLine($"支付请求成功,请使用以下URL生成二维码:{codeUrl}");
            }
            else
            {
                // 支付请求失败,输出错误信息
                var returnMsg = responseDoc.Root.Element("return_msg").Value;
                Console.WriteLine($"支付请求失败:{returnMsg}");
            }
        }

        // 生成签名方法
        private static string CreateSign(SortedDictionary<string, string> parameters, string apiKey)
        {
            var sb = new StringBuilder();
            foreach (var param in parameters)
            {
                if (!string.IsNullOrEmpty(param.Value) && param.Key != "sign")
                {
                    sb.Append($"{param.Key}={param.Value}&");
                }
            }
            sb.Append($"key={apiKey}"); // 最后拼接API密钥

            // 使用MD5算法生成签名
            using var md5 = MD5.Create();
            var hash = md5.ComputeHash(Encoding.UTF8.GetBytes(sb.ToString()));
            return BitConverter.ToString(hash).Replace("-", "").ToUpper();
        }
    }
}
1.3 代码解析与注意事项
  1. 参数构建与签名

    • 在请求参数中,nonce_str 是一个随机字符串,用于确保请求的唯一性。
    • sign 是由所有参数和API密钥生成的MD5签名,用于验证请求的完整性和合法性。
  2. 支付方式

    • trade_type 决定了支付方式,这里我们使用了 "NATIVE",即扫码支付。
  3. API调用

    • 微信支付API使用XML格式,因此请求和响应数据都需要用XML处理。
  4. 注意事项

    • API证书:部分支付接口(如退款接口)可能需要上传商户证书。
    • 安全性:生产环境中,请务必使用HTTPS以确保请求的安全性。

二、支付宝支付接口对接示例

2.1 前提准备

在对接支付宝支付接口前,需要准备以下内容:

  • 支付宝AppID及私钥、公钥。
  • 支付宝支付接口的网关地址。
2.2 支付宝支付示例代码

以下代码示例展示了如何通过.NET Core项目发起一个简单的支付宝支付请求:

using System;
using System.Net.Http;
using System.Security.Cryptography;
using System.Text;
using System.Threading.Tasks;
using System.Web;

namespace AlipayExample
{
    class Program
    {
        static async Task Main(string[] args)
        {
            // 支付宝支付的基本信息
            string appId = "你的支付宝AppID";
            string privateKey = "你的支付宝私钥";
            string alipayPublicKey = "支付宝公钥"; // 用于验签
            string notifyUrl = "https://你的回调地址"; // 支付成功后的回调地址
            string returnUrl = "https://你的同步回调地址"; // 支付完成后的跳转地址
            string outTradeNo = DateTime.Now.Ticks.ToString(); // 生成唯一的订单号
            string totalAmount = "1.00"; // 支付金额,单位为元
            string subject = "商品描述"; // 商品描述

            // 构建支付请求的参数
            var parameters = new SortedDictionary<string, string>
            {
                { "app_id", appId },
                { "method", "alipay.trade.page.pay" }, // 页面支付接口
                { "charset", "utf-8" },
                { "sign_type", "RSA2" },
                { "timestamp", DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss") },
                { "version", "1.0" },
                { "biz_content", $"{{\"out_trade_no\":\"{outTradeNo}\",\"product_code\":\"FAST_INSTANT_TRADE_PAY\",\"total_amount\":\"{totalAmount}\",\"subject\":\"{subject}\"}}" },
                { "notify_url", notifyUrl },
                { "return_url", returnUrl }
            };

            // 生成签名
            string sign = CreateSign(parameters, privateKey);
            parameters.Add("sign", sign);

            // 构建支付URL
            var query = new StringBuilder();
            foreach (var param in parameters)
            {
                query.Append($"{param.Key}={HttpUtility.UrlEncode(param.Value)}&");
            }
            string requestUrl = $"https://openapi.alipay.com/gateway.do?{query.ToString().TrimEnd('&')}";

            // 发送支付请求
            using var client = new HttpClient();
            var response = await client.GetAsync(requestUrl);

            // 支付宝的页面支付直接跳转到支付页面
            if (response.IsSuccessStatusCode)
            {
                Console.WriteLine($"请使用以下URL跳转到支付宝支付页面:{requestUrl}");
            }
            else
            {
                Console.WriteLine("支付请求失败,请检查参数配置。");
            }
        }

        // 生成签名方法
        private static string CreateSign(SortedDictionary<string, string> parameters, string privateKey)
        {
            var sb = new StringBuilder();
            foreach (var param in parameters)
            {
                if (!string.IsNullOrEmpty(param.Value) && param.Key != "sign")
                {
                    sb.Append($"{param.Key}={param.Value}&");
                }
            }

            // 使用RSA2进行签名
            var data = Encoding.UTF8.GetBytes(sb.ToString().TrimEnd('&'));
            using var rsa = RSA.Create();
            rsa.ImportFromPem(privateKey.ToCharArray());
            var signature = rsa.SignData(data, HashAlgorithmName.SHA256, RSASignaturePadding.Pkcs1);

            return Convert.ToBase64String(signature);
        }
    }
}
2.3 代码解析与注意事项
  1. 参数构建与签名

    • app_id 是支付宝分配给应用的唯一标识。
    • method 指定了调用的支付宝API接口,这里使用 alipay.trade.page.pay 代表电脑网站支付。
    • biz_content 是支付宝API特有的参数集合,用于传递订单信息。
  2. 签名方式

    • 支付宝支付中使用 RSA2 签名算法,即SHA256的RSA签名方式。确保使用正确的私钥进行签名,并且在支付宝后台配置相应的公钥用于验签。
  3. 同步和异步通知

    • notify_url 是支付成功后的服务器异步回调地址,支付宝会向此地址发送支付结果通知。
    • return_url 是支付完成后的用户跳转地址,可以是商户网站的订单详情页面。
  4. 安全性

    • 私钥必须严格保管,切勿泄露。生产环境中建议通过环境变量或安全存储解决方案来管理敏感信息。
  5. 注意事项

    • 时区问题:注意 timestamp 格式为 yyyy-MM-dd HH:mm:ss,确保服务器时区设置正确。
    • 签名问题:签名生成时务必保证参数顺序和编码正确,否则会导致签名校验失败。

三、总结

通过以上两个支付接口对接示例,您可以快速在.NET Core项目中集成微信支付和支付宝支付功能。关键点已注明注意事项说明,方便直接复制使用并理解其工作原理。

无论是微信支付的XML格式请求还是支付宝支付的URL拼接请求,这两种支付方式都在国内有广泛的应用。对于开发者而言,掌握这两种接口的对接方法,将大大提升项目的支付功能集成能力。


附:调试与验证

在实际开发和调试过程中,建议使用微信支付和支付宝提供的沙箱环境或测试账号进行调试。这样可以避免真实交易带来的风险,同时可以通过日志或接口文档深入理解支付流程的细节。

如有进一步的集成需求或遇到问题,欢迎随时讨论!

你可能感兴趣的:(ASP.NET,Core,微信)