通过微信官网提示安装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)

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

参考链接

评论可见,请评论后查看内容,谢谢!!!评论后请刷新页面。