GO 微信支付V3SDK回调踩坑

news2024/11/16 16:35:39

通过微信官网提示安装sdk外部库

SDK,工具 | 微信支付商户平台文档中心

下面只讲解微信支付回调部分

先成功下一单微信支付拿到支付回调的数据,方便后续调试

因为在go里面打印请求参数不方便我使用的php打印全部参数, 圈起来的部分是我们需要用到的数据

第一步编写代码:

只展示解密部分解密代码示例:

// 微信支付回调逻辑处理
func (orderPayService *OrderPayService) WxOrderPayCallback(c *gin.Context) (err error) {

	notifyReq, err := weixin.Decrypt(c)
	if err != nil {
		fmt.Println("微信回调参数解密失败:", err)
		return err
	}

	//解析Plaintext参数,这里面可以拿到订单的基本信息
	var data = []byte(notifyReq.Resource.Plaintext)
	var result map[string]interface{}
	err = json.Unmarshal(data, &result)
	if err != nil {
		fmt.Println("JSON转换失败:", err)
		return err
	}
	// 处理通知内容
	fmt.Println("解密结果", notifyReq)
	fmt.Println("解密结果Plaintext", result)

	
	return nil
}

// 微信支付回调解密
func Decrypt(c *gin.Context) (notifyReq *notify.Request, err error) {
	var (
		mchID                      = global.GVA_CONFIG.WeiXin.MchID                      // 商户号
		mchCertificateSerialNumber = global.GVA_CONFIG.WeiXin.MchCertificateSerialNumber // 商户证书序列号
		mchAPIv3Key                = global.GVA_CONFIG.WeiXin.MchAPIv3Key                // 商户APIv3密钥
		privateKeyPath             = "./resource/wxPay/apiclient_key.pem"                // 商户私钥文件
	)

	ctx := c             //这个参数是context.Background()
	request := c.Request //这个值是*http.Request

	// 使用 utils 提供的函数从本地文件中加载商户私钥,商户私钥会用来生成请求的签名
	mchPrivateKey, err := utils.LoadPrivateKeyWithPath(privateKeyPath)
	if err != nil {
		return nil, err
	}

	// 1. 使用 `RegisterDownloaderWithPrivateKey` 注册下载器
	err = downloader.MgrInstance().RegisterDownloaderWithPrivateKey(ctx, mchPrivateKey, mchCertificateSerialNumber, mchID, mchAPIv3Key)
	if err != nil {
		return nil, err
	}
	// 2. 获取商户号对应的微信支付平台证书访问器
	certificateVisitor := downloader.MgrInstance().GetCertificateVisitor(mchID)
	// 3. 使用证书访问器初始化 `notify.Handler`
	handler := notify.NewNotifyHandler(mchAPIv3Key, verifiers.NewSHA256WithRSAVerifier(certificateVisitor))

	transaction := new(payments.Transaction)
	notifyReq, err = handler.ParseNotifyRequest(ctx, request, transaction)
	// 如果验签未通过,或者解密失败
	if err != nil {
		fmt.Println(err)
		//return
	}
	// 处理通知内容
	fmt.Println(notifyReq.Summary)
	fmt.Println(transaction.TransactionId)
	// 如果验签未通过,或者解密失败
	if err != nil {
		return nil, err
	}

	return notifyReq, nil
}

第二步:

组装回调参数模拟回调请求,通过之前获取到的回调参数组装请求数据

 值得注意的是php打印出来的参数需要去掉http且下划线换成中划线

HTTP_WECHATPAY_TIMESTAMP =>WECHATPAY-TIMESTAMP

微信传过来的数据是(Wechatpay-Timestamp)可以不区分大小写

接下来就可以模拟数据调试回调接口了。

闭坑:

1、回调参数有一个时间戳,超时的订单验证会报错,切记不可更改请求里的Wechatpay-Timestamp时间戳,因为加密使用这个参数加密的改了之后一定是验证失败的

修改保存会提示下面的错误,不允许更改,修改不生效

 解决方案直接在终端vim命令行到外部库文件夹去改这个配置扩大超时时间,改完重启一下项目就生效了,这样一来这个订单的参数可以一直模拟使用

 2、模拟请求的参数一定要不能有空格,不能有换行,不然解密不成功

 在SDK中他会组装成下面的样子

 下面例子是异常的参数格式,比如带了空格或者换行

继续运行就会报错(verify signature with public key err:crypto/rsa: verification error)

 如果一切顺利我们就可以正确解析出回调的数据后续使用

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

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

相关文章

centos8.x系统安装K8S,kubernetes集群v1.23.9,docker支持的最后一个版本

1. 部署环境主机(条件说明) 卸载podman,centos默认安装了podman容器(不管有没有,执行下总没错),可能与docker存在冲突 #环境准备 master 192.168.186.128 CentOS Linux release 8.5 (Core) n…

软件接口测试是什么?有哪些好用的接口测试工具?

在软件开发中,接口是不可避免的。软件接口测试是一种验证应用程序接口是否按照设计规范进行交互和协作的测试方法。接口测试是将模块之间的接口连接在一起以进行完整系统测试的关键部分。 当软件开发过程中不同模块之间需要数据交互,采用接口协议来实现…

Qt之事件过滤器讲解并且实现快捷键切换鼠标焦点

目录 1、需求背景2、使用Qt键盘事件3、安装事件过滤器4、事件处理级别 1、需求背景 现在有一个类似于下方图的ui,用户需要在输入前一行内容后,需要摁下指定案件能够跳转到下一行继续进行输入。 2、使用Qt键盘事件 一种更为直接的解决方案是子类化QLi…

【SpringCloud-6】Config配置中心

集群环境下,服务节点很多,我们不可能对每个服务都维护一套自己的配置,有修改时把每个节点都改一遍。 所以需要一个公共的配置文件,并且还能实现动态刷新。 在springcloud中,springcloud config组件就是一个配置中心&…

8年测试老鸟整理,软件测试面试问题-初中级,全覆盖问题...

目录:导读 前言一、Python编程入门到精通二、接口自动化项目实战三、Web自动化项目实战四、App自动化项目实战五、一线大厂简历六、测试开发DevOps体系七、常用自动化测试工具八、JMeter性能测试九、总结(尾部小惊喜) 前言 一般测试面试分为…

pytorch动态调整学习率torch.optim.lr_scheduler import MultiStepLR

from torch.optim.lr_scheduler import MultiStepLR 简单来说,就是分阶段调整学习率. 用法: model ANet(classes5) #加载模型 optimizer optim.SGD(params model.parameters(), lr0.05) #优化方法使用SGD#在指定的epoch值&#x…

极端交换————晴问算法

文章目录 1 题目2 思路3 实现 1 题目 2 思路 以此比较最大值、最小值&#xff0c;记录最大、最小值以及其下标位置&#xff0c;结束遍历后&#xff0c;交换其位置。 3 实现 #include<iostream> using namespace std;int main(){int n;scanf("%d", &n);i…

30分钟,认识 html 本质

30分钟&#xff0c;认识 html 本质 html 是什么&#xff1f;html 起源html 发展标签分类空间占用方式布局文本修饰流媒体标签 预定义符号 Symbols弃用的部分标签学习 html html 是什么&#xff1f; HTML的英文全称是 Hyper Text Markup Language&#xff0c;即超文本标记语言。…

redismariadb + keepalived 高可用

目录 机器准备 安装后服务 redis 安装redis mariadb 安装mariadb 启动和配置 互为主从同步配置 keepalived keepalived安装 修改主从 keepalived的配置 主从配置-mariadb监控 主从配置-redis监控 查看和使用 Keepalived Mariadb redis 机器准备 两台机器&…

计算机专业套装书书单推荐

1、深度学习经典教程 深度学习动手学深度学习 “花书”与沐神大作双剑合璧&#xff0c;入门深度学习看这一套就够了&#xff0c;来自一线科学家的经验总结&#xff0c;人工智能机器学习AI算法数据科学领域的重磅作品。理论实战&#xff0c;一套书帮你get深度学习的各种知识。 …

RK3568/RK3588+LinuxCNC+Ethercat解决方案

RK3588是瑞芯微新一代旗舰级高端处理器&#xff0c;具有高算力、低功耗、超强多媒体、丰富数据接口等特点。搭载四核A76四核A55的八核CPU和ARM G610MP4 GPU&#xff0c;内置6.0TOPs算力的NPU。 有五大技术优势 1. 内置多种功能强大的嵌入式硬件引擎&#xff0c;支持8K60fps 的…

IDEA、Webstorm 书签(bookmark)使用

①设置标签 ctrl shift 数字 就可以给软件设置上标签 或者 直接F11就可以添加标签 ②查看设置的标签的位置 使用shift F11 就可以标记记录的标签。

Mysql经典面试题

***搜集到的一些有用的Mysql经典《八股文》&#xff0c;全篇手打&#xff0c;大家觉得有用的话点一个赞&#xff0c;持续更新 目录 1.Mysql锁的机制&#xff1a; 粒度分类&#xff1a; 思想分类&#xff1a; 实现分类&#xff1a; 状态分类&#xff1a; 1.Mysql锁的机制&…

【雕爷学编程】Arduino动手做(130)---5A交流电流模块

37款传感器与执行器的提法&#xff0c;在网络上广泛流传&#xff0c;其实Arduino能够兼容的传感器模块肯定是不止这37种的。鉴于本人手头积累了一些传感器和执行器模块&#xff0c;依照实践出真知&#xff08;一定要动手做&#xff09;的理念&#xff0c;以学习和交流为目的&am…

Jetson Orin定制载板SPI接口调试记录

1.前言 按照如下步骤操作配置SPI,但仍无法正常工作 启用spi的步骤: (1)使用jetson-io为spi1启用40pin 座子 (2)编辑dts(把TPM(slb9670)设备通过spi 连接),并使用dtc工具将dts编译为dtb。 将TPM的reg设置为0x02。 (3)设置extlinux.conf的FDT (4)reboot 应该…

多张显卡之间通信方式

显卡之间常见的通信方式有以下几种 1.broadcast&#xff08;广播&#xff09;&#xff1a;将一张卡上的数据传到其它所有的卡上&#xff08;下图中的out就是等于in&#xff09; 2. reduce&#xff08;归约&#xff09;&#xff1a;将所有显卡上的数据&#xff0c;相加/取平均/…

【AcWing】夏季每日一题2023 -- 4908. 饥饿的牛 -- Java Version

题目链接&#xff1a;https://www.acwing.com/problem/content/description/4911/ 1. 题解&#xff08;4908. 饥饿的牛&#xff09; y总视频讲解&#xff1a;https://www.acwing.com/video/4739/ 1.1 顺序遍历&#xff1a;区间计算 ⭐ 时间复杂度O(1)&#xff0c;空间复杂度O…

简单电感量测量装置电路设计

在电子制作和设计&#xff0c;经常会用到不同参数的电感线圈&#xff0c;这些线圈的电感量不像电阻那么容易测量&#xff0c;有些数字万用表虽有电感测量挡&#xff0c;但测量范围很有限。该电路以谐振方法测量电感值&#xff0c;测量下限可达 10nH&#xff0c;测量范围很宽&am…

iNav开源代码之AOCODARCH7DUAL蜂鸣器持续蜂鸣问题

iNav开源代码之AOCODARCH7DUAL蜂鸣器持续蜂鸣问题 1. 源由2. 分析2.1 逻辑分析2.2 接线连接2.3 动态测量2.4 软件配置2.5 现象分析2.6 对比分析 3. 总结4. 参考资料 1. 源由 最近上了iNav 6.1.1固件&#xff0c;总体感觉非常不错。但是出现了一个百思不得其解的蜂鸣器持续蜂鸣…

让MBR使用硬盘

前提知识&#xff1a; BIOS中断 BIOS 和 DOS 都是存在于实模式下的程序&#xff0c;由它们建立的中断调用都是建立在中断向量表&#xff08;Interrupt Vector Table&#xff0c;IVT&#xff09;中的。它们都是通过软中断指令 int 中断号来调用的。中断向量表中第 0H&#xff…