下面是基于C#实现微信支付宝扫码支付功能的完整攻略,包含以下主要步骤:
- 注册微信支付宝开发者账号
首先需要在微信支付宝官网进行注册开发者账号,然后创建应用,开通扫码支付功能。在创建应用的过程中,需要填写相关商户信息,包括商户唯一标识、接口秘钥等。
- 配置接口参数
在获取到商户信息之后,需要对接口参数进行配置,主要包括以下信息:商户号、应用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";
}
- 实现支付接口
根据微信支付宝接口规范,实现扫码支付接口,包括生成订单号、生成签名、生成支付二维码等过程。
具体实现方式如下:
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;
}
}
- 调用支付接口
在实现完支付接口之后,可以通过前端将产品名称、价格等信息传递给后台,然后调用支付接口生成支付二维码,最后在前端页面上展示二维码。用户通过扫码即可完成支付。
下面是两条调用示例说明:
微信支付二维码调用示例:
string qrCodeUrl = WxPayApi.GetPayQrCodeUrl("测试商品", 0.01m);
支付宝支付二维码调用示例:
string qrCodeUrl = AliPayApi.GetPayQrCodeUrl("测试商品", 0.01m);
以上就是基于C#实现微信支付宝扫码支付功能的完整攻略。
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:基于C#实现微信支付宝扫码支付功能 - Python技术站