官方没有给出orderInfo的格式,所以不得不在官方示例hello_uni_app中截取(用HBuilderX新建示例工程)
微信支付订单:
{
"data": {
"appid": "wx0411fa6a39d61297",
"noncestr": "jUsIgpt9H8meyYP1",
"package": "Sign=WXPay",
"partnerid": "1230636401",
"prepayid": "wx20205704684293f30de855041611765700",
"timestamp": 1576846624,
"sign": "ED84A75D5CE5FC4A9FF8DA81BB7B0AED"
},
"statusCode": 200,
"header": {
"Transfer-Encoding": "chunked",
"Server": "Tengine",
"X-Android-Selected-Protocol": "http/1.1",
"_": "HTTP/1.1 200 OK",
"Content-Type": "text/plain;charset=UTF-8",
"Via": "cache6.l2et2[257,0], kunlun7.cn698[278,0]",
"X-Android-Response-Source": "NETWORK 200",
"Date": "Fri, 20 Dec 2019 12:57:04 GMT",
"EagleId": "3da864a515768466244555534e",
"Connection": "keep-alive",
"Timing-Allow-Origin": "*",
"Access-Control-Allow-Origin": "*",
"X-Android-Sent-Millis": "1576846625019",
"X-Android-Received-Millis": "1576846625356",
"Vary": "[Accept-Encoding, Accept-Encoding]"
},
"errMsg": "request:ok"
}
支付宝订单:
{
"data": "alipay_sdk=alipay-sdk-php-20161101&app_id=2015112700878442&biz_content=%7B%22body%22%3A%22DCloud%E8%87%B4%E5%8A%9B%E4%BA%8E%E6%89%93%E9%80%A0HTML5%E6%9C%80%E5%A5%BD%E7%9A%84%E7%A7%BB%E5%8A%A8%E5%BC%80%E5%8F%91%E5%B7%A5%E5%85%B7%EF%BC%8C%E5%8C%85%E6%8B%AC%E7%BB%88%E7%AB%AF%E7%9A%84Runtime%E3%80%81%E4%BA%91%E7%AB%AF%E7%9A%84%E6%9C%8D%E5%8A%A1%E5%92%8CIDE%EF%BC%8C%E5%90%8C%E6%97%B6%E6%8F%90%E4%BE%9B%E5%90%84%E9%A1%B9%E9%85%8D%E5%A5%97%E7%9A%84%E5%BC%80%E5%8F%91%E8%80%85%E6%9C%8D%E5%8A%A1%E3%80%82%22%2C%22subject%22%3A+%22DCloud%E9%A1%B9%E7%9B%AE%E6%8D%90%E8%B5%A0%22%2C%22out_trade_no%22%3A+%2220191220204211%22%2C%22timeout_express%22%3A+%2230m%22%2C%22total_amount%22%3A+%220.1%22%2C%22product_code%22%3A%22QUICK_MSECURITY_PAY%22%7D&charset=UTF-8&format=json&method=alipay.trade.app.pay¬ify_url=http%253A%252F%252Fdemo.dcloud.net.cn%252Fpayment%252Falipay%252Fnotify.php&sign_type=RSA2×tamp=2019-12-20+20%3A42%3A11&version=1.0&sign=acgqEMfn7w0RPcslPIrDzD6HCktgATmtpuqwLfMsIiEESyngwoummXvxqkCqTFvpmBZ5EqlesHdGXNbj2qynNCNB%2BfqYda1IKVnx5GpjvDz6iZjhX2UCDB6FBytwb9EaGfArVuNPCbdPjlGu%2BEemwfcmWR8NQxpQJTlvgABhCjxBcdz1gD36O7Rz%2BUAExDllmNbBlUCm8WQ1RIxUdhFWyc%2BHR2KD9kOt6LwhaoSHk%2F7%2ByWsahCcEUGVgUMPdMxFvfgmo1eGi6zDoLmZc1l7M%2FwWx2aYEPNc2L7RVpORy8OYRG8mY1RnbFm5jU0MtW0Gvcma84Nt1XFLSRkqD5oWWEQ%3D%3D",
"statusCode": 200,
"header": {
"Transfer-Encoding": "chunked",
"Server": "Tengine",
"X-Android-Selected-Protocol": "http/1.1",
"_": "HTTP/1.1 200 OK",
"Content-Type": "text/plain;charset=UTF-8",
"Via": "cache25.l2et2[18,0], kunlun8.cn356[45,0]",
"X-Android-Response-Source": "NETWORK 200",
"Date": "Fri, 20 Dec 2019 12:42:11 GMT",
"EagleId": "7b8a431c15768457313923769e",
"Connection": "keep-alive",
"Timing-Allow-Origin": "*",
"Access-Control-Allow-Origin": "*",
"X-Android-Sent-Millis": "1576845731970",
"X-Android-Received-Millis": "1576845732056",
"Vary": "[Accept-Encoding, Accept-Encoding]"
},
"errMsg": "request:ok"
}
网上搜到的比较重要的几篇参考文章:
uniapp 开发踩坑记录
@将心比心
https://www.cnblogs.com/ailingfei/p/10620316.html
微信APP支付官方文档-统一下单:
https://pay.weixin.qq.com/wiki/doc/api/app/app.php?chapter=9_1
@将心比心同学踩坑时提醒的一条关键信息就是,app支付返回的sign是30位!30位!30位! 所以你在做验证计算后还得截取前30位给坑爹的uniapp才能用!
1.要注意返回的参数大小写要严格对应,至少你在调参数时候要注意大小写不然调不到
2.timestamp是int型,不是string
我的服务端下单处理回调的代码部分如下:
var appId = order_result.appid;
var timeStamp = TenPayV3Util.GetTimestamp();
var nonce_str = order_result.nonce_str;
switch (paymentChannel)
{
case PaymentChannel.小程序:
case PaymentChannel.公众号:
{
var package = $"prepay_id={order_result.prepay_id}";
var jobj = new JObject
{
{"appId", appId},
{"timeStamp", int.Parse(timeStamp)},
{"nonceStr", nonce_str},
{"package", package},
{"signType", "MD5"},
{"paySign", TenPayV3.GetJsPaySign(appId, timeStamp, nonce_str, package, api_key)},
};
return jobj;
}
case PaymentChannel.开放平台:
{
var package = "Sign=WXPay";
var partnerid = order_result.mch_id;
var prepay_id = order_result.prepay_id;
var paySign = TenPayV3.GetJsPaySign(appId, timeStamp, nonce_str, package, api_key);
var sign = paySign.Substring(0, 30);
var jobj = new JObject
{
{"appid", appId},
{"timestamp", int.Parse(timeStamp)},
{"noncestr", nonce_str},
{"package", package},
{"partnerid", partnerid},
{"prepayid", prepay_id},
{"sign", sign},
};
return jobj;
}
default:
throw new Exception($"不支持的支付渠道:{paymentChannel}");
}
看到没,小程序公众号用的是一套,区别就在于有没有appId不过用一套无所谓,app支付的回调参数全部小写,不用驼峰式
然后要注意的是app支付成功后,微信发送的支付回调api要写成异步
为什么异步不能用void呢?坑在这里:
Asp.Net Core 轻松学-经常使用异步的你,可能需要看看这个文章
@微信公众号:DotNet程序园
https://www.cnblogs.com/viter/p/10271212.html