openid:用户openId
outTradeNo:订单编号
description:商品描述
totalFee:金额
public string UnifiedOrder(string openid, string outTradeNo, string description, int totalFee)
{
SortedDictionary<string, object> parameters = new SortedDictionary<string, object>();
parameters.Add("appid", appId);
parameters.Add("mch_id", mchId);
parameters.Add("nonce_str", GetNonceStr());
parameters.Add("body", description);
parameters.Add("out_trade_no", outTradeNo);
parameters.Add("total_fee", totalFee.ToString());
parameters.Add("spbill_create_ip", "127.0.0.1");
parameters.Add("notify_url", notifyUrl);
parameters.Add("trade_type", "JSAPI");
parameters.Add("openid", openid);
string sign = CreateSign(parameters, AES_KEYV2);
parameters.Add("sign", sign);
string xml = DictionaryToXml(parameters);
HttpWebRequest request = (HttpWebRequest)WebRequest.Create("https://api.mch.weixin.qq.com/pay/unifiedorder");
request.Method = "POST";
request.ContentType = "text/xml";
byte[] data = Encoding.UTF8.GetBytes(xml);
request.ContentLength = data.Length;
Stream stream = request.GetRequestStream();
stream.Write(data, 0, data.Length);
stream.Close();
HttpWebResponse response = (HttpWebResponse)request.GetResponse();
StreamReader reader = new StreamReader(response.GetResponseStream(), Encoding.UTF8);
string result = reader.ReadToEnd();
reader.Close();
response.Close();
XmlDocument doc = new XmlDocument();
doc.LoadXml(result);
XmlNode rootNode = doc.SelectSingleNode("xml");
string returnCode = rootNode.SelectSingleNode("return_code").InnerText;
string resultCode = rootNode.SelectSingleNode("result_code").InnerText;
if (returnCode == "SUCCESS" && resultCode == "SUCCESS")
{
SortedDictionary<string, object> jsApiParameters = new SortedDictionary<string, object>();
jsApiParameters.Add("appId", appId);
jsApiParameters.Add("timeStamp", GetTimestamp());
jsApiParameters.Add("nonceStr", GetNonceStr());
jsApiParameters.Add("package", "prepay_id=" + rootNode.SelectSingleNode("prepay_id").InnerText);
jsApiParameters.Add("signType", "MD5");
string jsApiSign = CreateSign(jsApiParameters, AES_KEYV2);
jsApiParameters.Add("paySign", jsApiSign);
return DictionaryToJson(jsApiParameters);
}
else
{
throw new Exception(rootNode.SelectSingleNode("err_code_des").InnerText);
}
}
private string CreateSign(SortedDictionary<string, object> parameters, string key)
{
StringBuilder sb = new StringBuilder();
foreach (KeyValuePair<string, object> pair in parameters)
{
if (!string.IsNullOrEmpty(pair.Value.ToString()))
{
sb.Append(pair.Key + "=" + pair.Value + "&");
}
}
sb.Append("key=" + key);
return GetMd5(sb.ToString()).ToUpper();
}
private string GetMd5(string str)
{
MD5 md5 = new MD5CryptoServiceProvider();
byte[] data = Encoding.UTF8.GetBytes(str);
byte[] hash = md5.ComputeHash(data);
StringBuilder sb = new StringBuilder();
foreach (byte b in hash)
{
sb.Append(b.ToString("x2"));
}
return sb.ToString();
}
private string GetNonceStr()
{
Random random = new Random();
return GetMd5(random.Next(1000).ToString());
}
private string GetTimestamp()
{
TimeSpan ts = DateTime.UtcNow - new DateTime(1970, 1, 1, 0, 0, 0, 0);
return Convert.ToInt64(ts.TotalSeconds).ToString();
}
private string DictionaryToXml(SortedDictionary<string, object> dictionary)
{
StringBuilder sb = new StringBuilder();
sb.Append("<xml>");
foreach (KeyValuePair<string, object> pair in dictionary)
{
if (!string.IsNullOrEmpty(pair.Value.ToString()))
{
sb.Append("<" + pair.Key + ">" + "<![CDATA[" + pair.Value + "]]></" + pair.Key + ">");
}
}
sb.Append("</xml>");
return sb.ToString();
}
private string DictionaryToJson(SortedDictionary<string, object> dictionary)
{
StringBuilder sb = new StringBuilder();
sb.Append("{");
foreach (KeyValuePair<string, object> pair in dictionary)
{
if (!string.IsNullOrEmpty(pair.Value.ToString()))
{
sb.Append("\"" + pair.Key + "\":\"" + pair.Value + "\",");
}
}
sb.Remove(sb.Length - 1, 1);
sb.Append("}");
return sb.ToString();
}
其中 appId 微信appId,mchId商户号,notifyUrl回调地址,AES_KEYV2:v2秘钥
var local = encodeURIComponent(window.location.href);
var appid = $("#appId").text();
var url = 'https://open.weixin.qq.com/connect/oauth2/authorize?appid=' + appid + '&redirect_uri=' + local + '&response_type=code&scope=snsapi_base&state=STATE#wechat_redirect';
window.location.href = url;
var url ="Wechat/Pay?code=" + code;
$.ajax({
type: "GET",
url: url,
contentType: "application/x-www-form-urlencoded",
success: function (res) {
if (res.code == "1") {
var response = res.data;
WeixinJSBridge.invoke(
'getBrandWCPayRequest', {
"appId": response.appId,
"timeStamp": response.timeStamp,
"nonceStr": response.nonceStr,
"package": response.package,
"signType": response.signType,
"paySign": response.paySign
}, function (res) {
if (res.err_msg == "get_brand_wcpay_request:cancel") {
hintIfno("支付已经取消");
return false;
} else if (res.err_msg == "get_brand_wcpay_request:ok") {
hintIfno("支付成功");
} else {
hintIfno("支付失败,请返回列表页重新支付");
}
});
} else {
}
}
});
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 全程不用写代码,我用AI程序员写了一个飞机大战
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· 记一次.NET内存居高不下排查解决与启示
· DeepSeek 开源周回顾「GitHub 热点速览」
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了