微信支付API3 APP【统一下单 APIV3】

编程入门 行业动态 更新时间:2024-10-17 22:28:52

微信支付API3 APP【统一<a href=https://www.elefans.com/category/jswz/34/1767709.html style=下单 APIV3】"/>

微信支付API3 APP【统一下单 APIV3】

官方参考资料

签名:签名生成-接口规则 | 微信支付商户平台文档中心

签名生成:签名生成 - WechatPay-API-v3

统一下单接口:微信支付-开发者文档

如何查看证书序列号:证书相关 - WechatPay-API-v3

私钥和证书:私钥和证书 - WechatPay-API-v3

首先声明,我这个是为APP支付提供的接口!!!其他端使用时仅供参考!!

本地调试时记得安装微信支付安全证书!!!发布到服务器上也要安装微信支付安全证书!!!

私钥从微信支付后台发放的证书中拷贝出来!!!!!

  一、签名

    生成签名

参考资料里面讲的比较详细,也有官方的文档,不过文档不全,导致我的调试程序一直出现问题,请求微信的统一下单接口总是报400错误(Bad Request)。

签名生成参考官方代码,代码如下,里面有我标注的请求接口报400错误原因的代码

using System;
using System.IO;
using System.Net.Http;
using System.Security.Cryptography;
using System.Threading;
using System.Threading.Tasks;namespace HttpHandlerDemo
{// 使用方法// HttpClient client = new HttpClient(new HttpHandler("{商户号}", "{商户证书序列号}"));// ...// var response = client.GetAsync("");public class HttpHandler : DelegatingHandler{private readonly string merchantId;private readonly string serialNo;public HttpHandler(string merchantId, string merchantSerialNo){InnerHandler = new HttpClientHandler();this.merchantId = merchantId;this.serialNo = merchantSerialNo;}protected async override Task<HttpResponseMessage> SendAsync(HttpRequestMessage request,CancellationToken cancellationToken){var auth = await BuildAuthAsync(request);string value = $"WECHATPAY2-SHA256-RSA2048 {auth}";request.Headers.Add("Authorization", value);request.Headers.Add("Accept", "application/json");//如果缺少这句代码就会导致下单接口请求失败,报400错误(Bad Request)request.Headers.Add("User-Agent", "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.2; .NET CLR 1.0.3705;)");//如果缺少这句代码就会导致下单接口请求失败,报400错误(Bad Request)return await base.SendAsync(request, cancellationToken);}protected async Task<string> BuildAuthAsync(HttpRequestMessage request){string method = request.Method.ToString();string body = "";if (method == "POST" || method == "PUT" || method == "PATCH"){var content = request.Content;body = await content.ReadAsStringAsync();//debug的时候在这里打个断点,看看body的值是多少,如果跟你传入的参数不一致,说明是有问题的,一定参考我的方法}string uri = request.RequestUri.PathAndQuery;var timestamp = DateTimeOffset.Now.ToUnixTimeSeconds();string nonce = Path.GetRandomFileName();string message = $"{method}\n{uri}\n{timestamp}\n{nonce}\n{body}\n";string signature = Sign(message);return $"mchid=\"{merchantId}\",nonce_str=\"{nonce}\",timestamp=\"{timestamp}\",serial_no=\"{serialNo}\",signature=\"{signature}\"";}protected string Sign(string message){// NOTE: 私钥不包括私钥文件起始的-----BEGIN PRIVATE KEY-----//        亦不包括结尾的-----END PRIVATE KEY-----string privateKey = "{你的私钥}";byte[] keyData = Convert.FromBase64String(privateKey);using (CngKey cngKey = CngKey.Import(keyData, CngKeyBlobFormat.Pkcs8PrivateBlob))using (RSACng rsa = new RSACng(cngKey)){byte[] data = System.Text.Encoding.UTF8.GetBytes(message);return Convert.ToBase64String(rsa.SignData(data, HashAlgorithmName.SHA256, RSASignaturePadding.Pkcs1));}}}
}

使用方法

var url = "";var req = new GenerateOrderModelForWxPay{appid = WxPayConst.appid,mchid = WxPayConst.mchid,description = "商品名称",amount = new WxPayAmountModel{total = 1},out_trade_no = orderNumber,notify_url = ""};
HttpClient client = new HttpClient(new HttpHandler("{商户号}", "{商户证书序列号}"));
//GET 方式
var response = client.GetAsync("");// POST 方式var bodyJson = new StringContent(req.ToJson(), Encoding.UTF8, "application/json"); //一定要这样传递参数,不然在加密签名的时候获取到的参数就是\\u0这种形式的数据了,不是传递的这样的数据了,导致加密的结果不正确
var response = await client.PostAsync(url, bodyJson);// 读取统一下单之后的返回结果,这样读取出来的直接就是结果,或者错误原因,大家一定要这么搞啊!!!多么痛的领悟,会有具体的错误信息的。
var respStr = await response.Content.ReadAsStringAsync();//这里面就包含prepay_id了

大家一定看接口规则里面的说明,我就是没有看,导致我搞了一天没有搞通,下面贴两个截图

 

更多推荐

微信支付API3 APP【统一下单 APIV3】

本文发布于:2023-06-20 12:56:00,感谢您对本站的认可!
本文链接:https://www.elefans.com/category/jswz/34/801860.html
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。
本文标签:下单   APP

发布评论

评论列表 (有 0 条评论)
草根站长

>www.elefans.com

编程频道|电子爱好者 - 技术资讯及电子产品介绍!