新手开箱即用,有疑问可留言!
在现代的互联网应用中,集成微信支付和支付宝支付是十分常见的需求。本文将简要介绍如何在.NET Core项目中对接微信支付和支付宝支付接口,提供直接可用的代码示例,并强调一些关键注意事项。
在对接微信支付接口前,需要准备以下内容:
HttpClient
。以下代码示例展示了如何通过.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();
}
}
}
参数构建与签名:
nonce_str
是一个随机字符串,用于确保请求的唯一性。sign
是由所有参数和API密钥生成的MD5签名,用于验证请求的完整性和合法性。支付方式:
trade_type
决定了支付方式,这里我们使用了 "NATIVE"
,即扫码支付。API调用:
注意事项:
在对接支付宝支付接口前,需要准备以下内容:
以下代码示例展示了如何通过.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);
}
}
}
参数构建与签名:
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拼接请求,这两种支付方式都在国内有广泛的应用。对于开发者而言,掌握这两种接口的对接方法,将大大提升项目的支付功能集成能力。
在实际开发和调试过程中,建议使用微信支付和支付宝提供的沙箱环境或测试账号进行调试。这样可以避免真实交易带来的风险,同时可以通过日志或接口文档深入理解支付流程的细节。
如有进一步的集成需求或遇到问题,欢迎随时讨论!