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

news2024/11/25 8:19:38

官方参考资料

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

签名生成:签名生成 - 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("https://api.mch.weixin.qq.com/v3/certificates");
    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 = "https://api.mch.weixin.qq.com/v3/pay/transactions/app";
 var req = new GenerateOrderModelForWxPay
                {
                    appid = WxPayConst.appid,
                    mchid = WxPayConst.mchid,
                    description = "商品名称",
                    amount = new WxPayAmountModel
                    {
                        total = 1
                    },
                    out_trade_no = orderNumber,
                    notify_url = "https://xxx.com/api/WxPayCallback"
                };
HttpClient client = new HttpClient(new HttpHandler("{商户号}", "{商户证书序列号}"));
//GET 方式
var response = client.GetAsync("https://api.mch.weixin.qq.com/v3/certificates");

// 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了

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

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/80303.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

EXCEL基础:数据透视表(按年龄分组统计与统计各部门的工资情况)

【按年龄分组进行统计】&#xff1a; 如下为原始数据&#xff0c;最后就是年龄字段&#xff1a; 选择数据单元格&#xff0c;在新表里插入【数据透视表】&#xff0c;若数据透视表的【字段列表】没有显示&#xff0c;可以按照1标注那里勾选&#xff0c; 按照2处的列、行和统计…

Pytorch:使用官网提供数据集的相关参数设置,以CIFAR10为例进行说明

文章目录前言一、Dataset定义-组成分类二、获取数据集1.参数说明2.相关Demo前言 本文记录笔者关于Dataset的相关学习记录&#xff0c;以Pytorch官网文档为主进行学习 一、Dataset 定义-组成 所谓Dataset&#xff0c;指的是我们在学习神经网络中要接触的数据集&#xff0c;一…

[附源码]Python计算机毕业设计SSM基于的楼盘销售系统的设计与实现(程序+LW)

项目运行 环境配置&#xff1a; Jdk1.8 Tomcat7.0 Mysql HBuilderX&#xff08;Webstorm也行&#xff09; Eclispe&#xff08;IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持&#xff09;。 项目技术&#xff1a; SSM mybatis Maven Vue 等等组成&#xff0c;B/S模式 M…

关于近期虚拟化学习遇到的问题总结

一、关于Intel VT-x/EPT. 不使用虚拟化的Intel VT-x/EPT 因为需要在Linux中使用kvm做虚拟化因此需要开放宿主虚拟机的虚拟权限 但是打开报错 首先想要开启虚拟化&#xff0c;你的cpu是一定要支持虚拟化的 如何查看呢&#xff0c;可以ctrlaltdel打开任务管理器 点击性能 可以看…

电子加速器原理与应用

辐射单位 射线能量ϵ\epsilonϵ&#xff0c;单位eVeVeV ϵhν\epsilon h\nuϵhν&#xff0c;普朗克常数hhh&#xff0c;电磁波频率ν\nuν 电子伏特eVeVeV&#xff1a;一个电子&#xff08;电量为1.610C&#xff09;经过1VVV的电位差加速后获得的动能。 1eV1.610−19J1.610−…

计及碳捕集电厂低碳特性的含风电电力系统源–荷多时间尺度调度方法(Matlab代码实现)

&#x1f4a5;&#x1f4a5;&#x1f49e;&#x1f49e;欢迎来到本博客❤️❤️&#x1f4a5;&#x1f4a5; &#x1f3c6;博主优势&#xff1a;&#x1f31e;&#x1f31e;&#x1f31e;博客内容尽量做到思维缜密&#xff0c;逻辑清晰&#xff0c;为了方便读者。 ⛳️座右铭&a…

[附源码]Python计算机毕业设计SSM基于的楼盘销售管理系统(程序+LW)

项目运行 环境配置&#xff1a; Jdk1.8 Tomcat7.0 Mysql HBuilderX&#xff08;Webstorm也行&#xff09; Eclispe&#xff08;IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持&#xff09;。 项目技术&#xff1a; SSM mybatis Maven Vue 等等组成&#xff0c;B/S模式 M…

Java基本微信小程序的适老化老人健康预警系统 springboot+vue

随着信息技术和网络技术的飞速发展&#xff0c;人类已进入全新信息化时代&#xff0c;传统管理技术已无法高效&#xff0c;便捷地管理信息。为了迎合时代需求&#xff0c;优化管理效率&#xff0c;各种各样的管理系统应运而生&#xff0c;各行各业相继进入信息管理时代&#xf…

LinkedList(Java8)个人理解

问题&#xff1a;LinkedList 的 Node 怎么理解&#xff1f; Node 是 LinkedList 的私有静态内部类&#xff0c;作为链表结构的基本元素&#xff0c;可以看作是链条上的一个节&#xff08;结&#xff09;点。一个 node 对象中除了存储元素的值外&#xff0c;还存储着前一个 nod…

【软件测试】测试员vs测试工程师,你是测试员还是测试工程师?

目录&#xff1a;导读前言一、Python编程入门到精通二、接口自动化项目实战三、Web自动化项目实战四、App自动化项目实战五、一线大厂简历六、测试开发DevOps体系七、常用自动化测试工具八、JMeter性能测试九、总结&#xff08;尾部小惊喜&#xff09;前言 不是什么时候&#…

[Java] 序列化(Serialization)的本质是什么?在Java中怎么实现?为什么要了解序列化技术?序列化技术选型要点是什么?

文章目录前言序列化是什么&#xff1f;理解对象在内存中是如何存储的数据在进程内存中的分布图数据被序列化之后在内存中的分布图序列化/反序列化的本质&#xff1f;序列化在Java中的实现&#xff1f;1. JDK Serialization&#xff08;不推荐使用&#xff09;2. 第三方实现&…

本地完成Vue脚手架和Django建立连接

目录 在Vue中 setting.py中&#xff1a; urls.py中 首先把要连接的Django项目和Vue脚手架创建好 之后我们把整个Vue拖到Django的文件夹根目录下&#xff0c;于manage.py同级即可&#xff08;图中data-work为我的Vue&#xff09; 在Vue中 进入到vue.config.js文件夹下 添加as…

全栈Jmeter接口测试(三):jmeter利用察看结果树查看响应调试取样器(Debug Sampler),设置HTTP信息头管理器模拟请求头

Jmeter(5)&#xff1a;jmeter利用察看结果树查看响应&调试取样器(Debug Sampler) 察看结果树选项介绍&#xff1a; 名称&#xff1a;本属性用于标识一个察看结果树元件&#xff0c;建议使用一个有意义的名称 注释&#xff1a;对于测试没有任何作用&#xff0c;仅用户记录用…

初级西班牙语教程

初级西班牙语教程 通过使用我的简化方法变得会话和流利的完整指南学习西班牙语 课程英文名&#xff1a;Spanish Made Simple Beginner Spanish 此视频教程共28.0小时&#xff0c;中英双语字幕&#xff0c;画质清晰无水印&#xff0c;源码附件全 下载地址 课程编号&#xff…

MySQL MVCC详解

为什么需要MVCC 在没有MVCC之前&#xff0c;是使用读写锁&#xff08;共享锁/排它锁&#xff09;来进行并发控制的&#xff0c;读锁和读锁之间不互斥&#xff0c;写锁和读锁互斥&#xff0c;写锁和写锁互斥。 但是频繁加锁会导致数据库性能低下&#xff0c;这时出现了一种不加…

数字脉冲参数

脉冲幅度vm。脉冲电压波形变化的最大值&#xff0c;单位为伏&#xff08;v&#xff09;。脉冲上升时间tr。脉冲波形从0.1vm上升到0.9vm所需的时间。脉冲下降时间tf。脉冲波形从0.9vm下降到0.1vm所需的时间。 脉冲上升时间tr和下降时间tf越短&#xff0c;越接近于理想的短形脉冲…

Redis实战——Redisson分布式锁

目录 1 基于Redis中setnx方法的分布式锁的问题 2 Redisson 2.1 什么是Redisson 2.2 Redisson实现分布式锁快速入门 2.3 Redisson 可重入锁原理 什么是可重入锁&#xff1f; Redisson中又是如何实现的呢&#xff1f; 2.4 Redisson分布式锁的可重试性 2.5 Redisson分布式锁的主从…

【C语言经典题目】调整奇数偶数顺序、有序序列合并以及有序序列判断

目录 一、调整奇数偶数顺序 1.思路一&#xff08;使用多个数组&#xff09; ①使用两个数组&#xff08;双指针法&#xff09; ②使用三个数组 2.思路二&#xff08;不创建其他的数组&#xff0c;双指针&#xff09; 二、有序数组合并 1.思路一 2.思路二 三、有序序列判…

【springboot进阶】基于starter项目构建(二)构建starter项目-mysql

目录 一、创建 mysql-spring-boot-starter 项目 二、添加 pom 文件依赖 三、构建配置 1. mybatis-plus分页配置 MybatisPlusConfig 2. mybatis-plus代码生成器 CodeGenerator 四、加载自动化配置 五、打包 六、使用 这个系列讲解项目的构建方式&#xff0c;主要使用 父…

第二证券|事关A股!4万亿外资巨头最新研判

时值年末&#xff0c;在多重利好音讯提振下&#xff0c;我国股市迎来一波反弹&#xff0c;海外本钱大举加仓我国财物。下一年全球经济将走向何方&#xff1f;国内和海外商场又会有哪些变化&#xff1f;财物装备该怎样做&#xff1f;近期&#xff0c;联博资深商场策略师黄森玮、…