场景

本人正在对接微信小程序的微信支付,使用的是 PHP + EasyWechat 这样的技术栈,本想着一下子就可以搞定了,结果踩了个大坑,就是当我通过后端向微信服务器发起支付请求后,直接将请求结果返回给小程序。然后以为微信服务器返回的 sign 就是传给小程序支付的 paySign 。其实不是!
真正的 paySign 是还需要在微信服务器返回消息后拿支付密钥在后端自己算出来,在发给小程序发起支付的。

解决代码

下面给出我的支付代码,防止大家踩坑,大家可以自己复制去用

后端

        $order = ['body' => '天猫超市-鸡蛋购买','out_trade_no' => 订单号,'openid' => 这里填下单用户的openid,'total_fee' =>  100, // 如果你的价钱是小数记得要 * 100'trade_type' => 'JSAPI','notify_url' => 回调地址,'sign_type' => 'MD5',];//self::wechatPayInstance() 就是 EasyWechat 这个包的 Factory::payment($config),稍微封装了一下$res = self::wechatPayInstance()->order->unify($order);if ($res['return_code'] != 'SUCCESS'){throw new Exception('订单已创建,但发起微信支付失败');}$appId = $res['appid'];$nonceStr = $res['nonce_str'];$prepay_id = $res['prepay_id'];$timeStamp = time();$key = config('wxpay.key');$paySign = md5("appId=$appId&nonceStr=$nonceStr&package=prepay_id=$prepay_id&signType=MD5&timeStamp=$timeStamp&key=$key"); // 这个地方就是我所说的二次签名!return [ // 返回给小程序使用'nonceStr' => $nonceStr,'prepay_id' => $prepay_id,'timeStamp' => strval($timeStamp), // 小程序支付的timeStamp参数,必须使用这个 timeStamp,因为他已经被计算到了paySign中'paySign' => $paySign,'signType' => 'MD5'];

前端

// pay_info 就是刚才后端返回的那个数组
const config = {timeStamp: pay_info.timeStamp,nonceStr : pay_info.nonceStr,package: `prepay_id=${pay_info.prepay_id}`,signType: pay_info.signType,paySign: pay_info.paySign,}wx.requestPayment({ ...config,success() {console.log('微信支付成功')resolve()},fail(e) {console.log('微信支付失败', e)reject()}})
})

总结

首先,出现这样的问题是在所难免的,但是我认为我有以下几点做的好,也有几点做的不好。

做的比较好的

  1. 首先出现问题后第一时间比对参数,检查代码是否正确做的很好。
  2. 在尝试很多种方法后,能够不偷懒,重新将以前的项目配置跑起来,进行对比最终找到问题是一个很好的点。以后如果也有这样的问题,最好也要用这种方式解决。

做的不好的

  1. 在检查完参数后没有及时仔细的阅读原有官方文档,导致没有及时发现问题,浪费了大量时间在百度和谷歌上。
  2. 出现问题一直犟着不肯休息,对身体不好,以后一定要注意!休息 5 分钟都是好的。

微信支付出现支付验证签名失败的问题(忘记二次计算签名导致)相关推荐

  1. 企业微信服务商代开发应用验证CallBackUrl失败

    2022年6月28日23点之后,企业微信第三方代开发应用,对于企业的CorpID新建应用,需要使用加密后的CropID才能认证通过,官方文档真的是太简洁了,折磨了许久. 本文档用于服务商给客户做代开发 ...

  2. 微信订阅消息 开启验证token失败解决方法

    下面代码放到你填写的url地址里面就好了 public function checksignature(){$signature = $this->request->get('signat ...

  3. ##iOS中的微信支付 支付验证签名失败

    iOS中的微信支付 支付验证签名失败 今天要在项目中添加微信支付,iOS端的所有东西都已经按照文档搞好了,可就是跳转到微信的时候显示"支付验证签名失败",可是安卓端的都没有问题,就 ...

  4. ios不行安卓可以 微信签名_微信支付-支付验证签名失败(iOS)

    在项目中添加微信支付,iOS端的所有东西都已经按照文档搞好了,可就是跳转到微信的时候显示"支付验证签名失败",可是安卓端的都没有问题,就很郁闷了. 后来在对文档的时候发现... 6 ...

  5. 关于微信APP支付,提示支付验证签名失败

    最近做微信APP支付,在"统一下单"里加签没有问题,调用成功,但是在 "调起支付"后却提示  支付验证签名失败. 先说一下请求的参数,参数一共有七个: prep ...

  6. 微信支付 支付验证签名失败

    公众号支付,WeixinJSBridge.invoke()方法,返回错误:支付验证签名失败 检查后台签名参数.支付密钥均正确,却还是错误,最后询问微信支付技术才解决,问题所在就是微信给的java sd ...

  7. 服务商模式下微信小程序支付时,一直报“支付验证签名失败”错误的解决办法

    在写小程序支付的时候,我是以服务商模式发起的支付,统一下单接口是调用成功的,但是在小程序调起支付的时候就报"支付验证签名失败"的错误. 主要有三个原因: 1.第二次签名用到的tim ...

  8. php 苹果支付验证失败的原因,iOS 微信支付报错 支付验证签名失败

    可能的原因有两个: 一.传给微信sdk的参数中时间戳的格式错误. iOS中时间戳的格式要求是32位的int类型 image.png 一般服务器返回的是字符串需要强制转换成32位int类型的值 二.服务 ...

  9. 微信公众号之支付验证签名失败

    微信公众号支付最坑莫过于paySign的生成,因为他的生成参数和统一下单获得sign的生成参数不一样,因次我在这里一直弹出支付验证签名失败.最后发现paySign的生成参数是:appId,timeSt ...

最新文章

  1. 报错解决transmission: Error: Input/Output error和ls: reading directory '': Input/output error
  2. 运维监控系统——Zabbix简介
  3. 如何看待清华北大毕业生流失去国外?
  4. 由c#的值类型与引用类型说开去
  5. sdut 3333 数据结构实验之栈与队列六:下一较大值(二)
  6. 运维的基本知识点及分类工作
  7. Java中同时输入字符串和int类型出错的处理方式
  8. [原创]windows server 2012 AD架构 试验 系列 – 5 AD备份与还原
  9. 设置WordPress文章关键词自动获取,文章所属分类名称,描述自动获取文章内容,给文章的图片自动加上AlT标签...
  10. 【转】Dynamics 365 CRM 开发架构简介
  11. C++学习笔记系列之继承多态
  12. 数据库自动备份脚本并删除前3天的备份
  13. Vb.net/VB 声明API功能父窗口功能
  14. Win10 + CUDA10.1+pytorch手动安装
  15. insert时调用本身字段_多线程编程时,7件你必须知道的事情
  16. android studio乱码
  17. 数据权限设计研究-行数据权限
  18. SwiftUI HealthKit 基础教程
  19. 《鲸鱼安慰了大海》精选篇章
  20. 06-jQuery的文档操作***

热门文章

  1. 超级百亿补贴,史上最大优惠:京东11.11开启
  2. Qt Creator新建项目详解
  3. TensorFlow 强化学习:6~10
  4. 最优化问题学习笔记1-对偶理论
  5. 【将web进行到底之长大在线系列教程】(四) === 第三章 FLASH动画制作
  6. 最大的英文手写数据集——IAM- ondb 简介、下载、读取、使用、分割及深度学习实战
  7. 【qt】textEdit或者QMessageBox显示中文乱码
  8. QQ网页强制聊天,微博一键关注
  9. python模拟登陆友盟网站并获取我的站点信息
  10. 小师弟:2022广东省工科赛分享(越障排爆省一,完整项目)