新手开箱即用,有疑问可留言!
在现代的互联网应用中,集成微信支付和支付宝支付是十分常见的需求。本文将简要介绍如何在.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 代码解析与注意事项
-
参数构建与签名:
- 在请求参数中,
nonce_str
是一个随机字符串,用于确保请求的唯一性。 sign
是由所有参数和API密钥生成的MD5签名,用于验证请求的完整性和合法性。
- 在请求参数中,
-
支付方式:
trade_type
决定了支付方式,这里我们使用了"NATIVE"
,即扫码支付。
-
API调用:
- 微信支付API使用XML格式,因此请求和响应数据都需要用XML处理。
-
注意事项:
- 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 代码解析与注意事项
-
参数构建与签名:
app_id
是支付宝分配给应用的唯一标识。method
指定了调用的支付宝API接口,这里使用alipay.trade.page.pay
代表电脑网站支付。biz_content
是支付宝API特有的参数集合,用于传递订单信息。
-
签名方式:
- 支付宝支付中使用
RSA2
签名算法,即SHA256的RSA签名方式。确保使用正确的私钥进行签名,并且在支付宝后台配置相应的公钥用于验签。
- 支付宝支付中使用
-
同步和异步通知:
notify_url
是支付成功后的服务器异步回调地址,支付宝会向此地址发送支付结果通知。return_url
是支付完成后的用户跳转地址,可以是商户网站的订单详情页面。
-
安全性:
- 私钥必须严格保管,切勿泄露。生产环境中建议通过环境变量或安全存储解决方案来管理敏感信息。
-
注意事项:
- 时区问题:注意
timestamp
格式为yyyy-MM-dd HH:mm:ss
,确保服务器时区设置正确。 - 签名问题:签名生成时务必保证参数顺序和编码正确,否则会导致签名校验失败。
- 时区问题:注意
三、总结
通过以上两个支付接口对接示例,您可以快速在.NET Core项目中集成微信支付和支付宝支付功能。关键点已注明注意事项说明,方便直接复制使用并理解其工作原理。
无论是微信支付的XML格式请求还是支付宝支付的URL拼接请求,这两种支付方式都在国内有广泛的应用。对于开发者而言,掌握这两种接口的对接方法,将大大提升项目的支付功能集成能力。
附:调试与验证
在实际开发和调试过程中,建议使用微信支付和支付宝提供的沙箱环境或测试账号进行调试。这样可以避免真实交易带来的风险,同时可以通过日志或接口文档深入理解支付流程的细节。
如有进一步的集成需求或遇到问题,欢迎随时讨论!