PHP微信小程序支付——签名错误

Wesley13
• 阅读 1356

PHP微信小程序支付——签名错误

先分清几个概念:微信公众平台、微信开放平台、微信商户平台

1.微信公众平台、微信开放平台、微信商户平台是三个不同的平台

2.微信公众平台:用于公众号、小程序等等的设置平台,包括APPID、APPSECRET(注:每个公众号、每个小程序的APPID都是独立的、不一样的,所以如果是要用某个小程序支付,那就要用那个小程序的APPID、APPSECRET,不能混淆)。也就是用于微信这个APP本身的设置

3.微信开放平台:用于微信APP与其他APP的“连接”、“沟通”,为其他APP提供了如微信登录、微信分享、微信支付等功能(比如在使用12306APP买票的时候可以选择用微信支付)

4.微信商户平台:是用于微信商户支付设置,因为支付功能属于一个大的模块,所以微信单独分离出了这个平台,微信商户的账号就是MCHID,进入微信商户平台后,设置的支付的密钥就是KEY,设置支付密钥前要安装操作证书以及设置操作密码等

PHP微信小程序支付——签名错误

4.微信支付目前有下面这几种,小程序支付实际调用的是公众号支付

PHP微信小程序支付——签名错误

5.微信号可以用来登录微信公众平台和微信商户平台,一个微信号可以申请多个公众号、多个小程序,多个微信商户号,所以在配置支付的时候一定要注意哪个小程序对应的哪个微信商户号,一旦配置错误,经常在程序中校验签名的时候返回“签名错误”(个人觉得微信还可以再提示的详细一些,到底是什么错误,避免N次的Debug)

6.官方提供了签名校验工具:https://pay.weixin.qq.com/wiki/doc/api/jsapi.php?chapter=20_1

把生成好的xml及商户key对应填入,即可校验,如果校验失败,说明xml格式不正确或者sign与商户KEY不匹配,xml格式不正确请参阅:https://pay.weixin.qq.com/wiki/doc/api/jsapi.php?chapter=9_1,商户KEY不匹配请重新比对并设置商户KEY

(特别说明:xml校验通过,只能说明xml的格式以及sign签名与商户KEY是匹配的,并不代表APPID、MCHID、KEY、APPSECRET配置的是正确的,这句话一定好好理解一下)

综上,只要是使用的官方sdk(https://pay.weixin.qq.com/wiki/doc/api/jsapi.php?chapter=11_1)开发的,xml校验通过了,并且配置对了APPID、MCHID、KEY、APPSECRET的,绝大多数的“签名错误”都可以解决了。

-----------------------------------------------------------------------------------------------------------------

以下是网上转载的代码,仅供参考:https://blog.csdn.net/ufo00001/article/details/75712479

前端:比较简单,在对应的支付事件上进行网络请求就好:

view_moneysure:function(){

var code = this.data.code;
console.log('code是' +code)
wx.request({
  url: 'https://...com/pay.php',//这个链接是后端写的
  header: {
    'Content-Type': 'application/x-www-form-urlencoded'
  },
  data: {
    code: code,
  },
  method: 'POST', 
  success: function (response) {
    console.log( response.data);
    // 发起支付
    wx.requestPayment({
      'appId': response.data.appId,
      'timeStamp': response.data.timeStamp,
      'nonceStr': response.data.nonceStr,
      'package': response.data.package,
      'signType': 'MD5',
      'paySign': response.data.paySign,
      'success': function (res) {
        wx.showToast({
            title: '支付成功'
        });
        console.log(res);
      },
      'fail': function (res) {
        console.log(res)
      }
    });
  },
  fail: function (res) {
    console.log(res)
  }
})

},

后端代码:

1. pay.php //小程序请求的后端地址

SetBody("testceshi"); // 订单号应该是由小程序端传给服务端的,在用户下单时即生成,demo中取值是一个生成的时间戳 $input->SetOut\_trade\_no(time().''); // 费用应该是由小程序端传给服务端的,在用户下单时告知服务端应付金额,demo中取值是1,即1分钱 $input->SetTotal\_fee("1"); $input->SetNotify\_url("https://...com/notify.php");//需要自己写的notify.php $input->SetTrade\_type("JSAPI"); // 由小程序端传给后端或者后端自己获取,写自己获取到的, $input->SetOpenid('UdhncondJcnkJnjknkcssdcAbckn'); //$input->SetOpenid($this->getSession()->openid); // 向微信统一下单,并返回order,它是一个array数组 $order = WxPayApi::unifiedOrder($input); // json化返回给小程序端 header("Content-Type: application/json"); echo $this->getJsApiParameters($order); } private function getJsApiParameters($UnifiedOrderResult) { //判断是否统一下单返回了prepay\_id if(!array\_key\_exists("appid", $UnifiedOrderResult) || !array\_key\_exists("prepay\_id", $UnifiedOrderResult) || $UnifiedOrderResult\['prepay\_id'\] == "") { throw new WxPayException("参数错误"); } $jsapi = new WxPayJsApiPay(); $jsapi->SetAppid($UnifiedOrderResult\["appid"\]); $timeStamp = time(); $jsapi->SetTimeStamp("$timeStamp"); $jsapi->SetNonceStr(WxPayApi::getNonceStr()); $jsapi->SetPackage("prepay\_id=" . $UnifiedOrderResult\['prepay\_id'\]); $jsapi->SetSignType("MD5"); $jsapi->SetPaySign($jsapi->MakeSign()); $parameters = json\_encode($jsapi->GetValues()); return $parameters; } //这里是服务器端获取openid的函数 // private function getSession() { // $code = $this->input->post('code'); // $url = 'https://api.weixin.qq.com/sns/jscode2session?appid='.WxPayConfig::APPID.'&secret='.WxPayConfig::APPSECRET.'&js\_code='.$code.'&grant\_type=authorization\_code'; // $response = json\_decode(file\_get\_contents($url)); // return $response; // } } $WxPay = new WXPay(); $WxPay->index(); 2\.  微信SDK 下载链接:[https://pay.weixin.qq.com/wiki/doc/api/download/WxpayAPI\_php\_v3.zip](https://www.oschina.net/action/GoToLink?url=https%3A%2F%2Fpay.weixin.qq.com%2Fwiki%2Fdoc%2Fapi%2Fdownload%2FWxpayAPI_php_v3.zip)  解压在lib文件夹下可以看到: ![](https://static.oschina.net/uploads/img/201805/09143955_JzgK.jpg) 放到服务端可访问的目录下。 在WxPayConfig.php里面配置账号信息: class WxPayConfig { //=======【基本信息设置】===================================== // /\*\* \* TODO: 修改这里配置为您自己申请的商户信息 \* 微信公众号信息配置 \* \* APPID:绑定支付的APPID(必须配置,开户邮件中可查看) \* \* MCHID:商户号(必须配置,开户邮件中可查看) \* \* KEY:商户支付密钥,参考开户邮件设置(必须配置,登录商户平台自行设置) \* 设置地址:https://pay.weixin.qq.com/index.php/account/api\_cert \* \* APPSECRET:公众帐号secert(仅JSAPI支付的时候需要配置, 登录公众平台,进入开发者中心可设置), \* 获取地址:https://mp.weixin.qq.com/advanced/advanced?action=dev&t=advanced/dev&token=2005451881&lang=zh\_CN \* @var string \*/ const APPID = 'wx123456789...';//这里填上自己的对应信息 const MCHID = '14151666888'; const KEY = '11223344556677889900'; const APPSECRET = '828bfsdibfsiubfikdbfik'; const NOTIFY\_URL='https://...com/notify.php'; 注: 期间遇到一个签名错误,一直不好,使用[微信支付接口签名校验工具](https://www.oschina.net/action/GoToLink?url=https%3A%2F%2Fpay.weixin.qq.com%2Fwiki%2Fdoc%2Fapi%2Fjsapi.php%3Fchapter%3D20_1)校验也没有错,像网上说的漏写错写参数都查了,就是一直返回 这样的信息,最后解决办法是:重置了KEY (商户支付密钥),重置的和之前的一模一样,但竟然就可以了... 问题主要都是报签名错误,仔细检查就好,比如XML格式不对,MD5加密后的位数,字典排序没排好,缺少参数等... [https://pay.weixin.qq.com/wiki/doc/api/wxa/wxa\_api.php?chapter=9\_1&index=1](https://www.oschina.net/action/GoToLink?url=https%3A%2F%2Fpay.weixin.qq.com%2Fwiki%2Fdoc%2Fapi%2Fwxa%2Fwxa_api.php%3Fchapter%3D9_1%26index%3D1) 3.最后附上notify.php SetTransaction\_id($transaction\_id); $result = WxPayApi::orderQuery($input); if(array\_key\_exists("return\_code", $result) && array\_key\_exists("result\_code", $result) && $result\["return\_code"\] == "SUCCESS" && $result\["result\_code"\] == "SUCCESS") { return true; } return false; } //重写回调处理函数 public function NotifyProcess($data, &$msg) { $notfiyOutput = array(); if(!array\_key\_exists("transaction\_id", $data)){ $msg = "输入参数不正确"; return false; } //查询订单,判断订单真实性 if(!$this->Queryorder($data\["transaction\_id"\])){ $msg = "订单查询失败"; return false; } return true; } } $notify = new PayNotifyCallBack(); $notify->Handle(false);
点赞
收藏
评论区
推荐文章
ThinkPHP V5.0 接入微信支付+回调
ThinkPHPV5.0接入微信支付微信支付接口组装访问数组$data'body''商城购买商品';//订单标题$data'outtradeno'generaterandstr(8,0);//平台订单号(非小程序订单,自己平台生成的)$data'notifyurl'$thisrequestdomain().'';//微信支付
Easter79 Easter79
3年前
thinkcmf+jsapi 实现微信支付
首先从小程序端接收订单号、金额等参数,然后后台进行统一下单,把微信支付的订单号返回,在把订单号发送给前台,前台拉起支付,返回参数后更改支付状态。。。回调publicfunctionnotify(){$wechatDb::name('wechat')where('status',1)find();
Jacquelyn38 Jacquelyn38
3年前
手写一个仿微信登录的nodejs程序
前言首先,我们看一下微信开放文档中的一张图:上面的一幅图中清楚地介绍了微信登录整个过程,下面对图上所示进行总结:一、二维码的获得1.用户打开登录网页后,登录网页后台根据微信OAuth2.0协议向微信开发平台请求授权登录,并传递事先在微信开发平台中审核通过的AppID和AppSecrect等参数;2.微信开发平台对AppID等参数进行验证,并向
梦
3年前
微信小程序new Date()转换时间异常问题
微信小程序苹果手机页面上显示时间异常,安卓机正常问题image(https://imghelloworld.osscnbeijing.aliyuncs.com/imgs/b691e1230e2f15efbd81fe11ef734d4f.png)错误代码vardate'2021030617:00:00'vardateT
Easter79 Easter79
3年前
Taro小程序自定义顶部导航栏
微信自带的顶部导航栏是无法支持自定义icon和增加元素的,在开发小程序的时候自带的根本满足不了需求,分享一个封装好的组件,支持自定义icon、扩展dom,适配安卓、ios、h5,全面屏。我用的是京东的Taro多端编译框架写的小程序,原生的也可以适用,用到的微信/taro的api做调整就行,实现效果如下。!在这里插入图片描述(https://i
Wesley13 Wesley13
3年前
Java微信公众平台开发(八)
我们上一篇写了关注出发图片的回复。想着在发送一次音乐,最后基于回复消息分类情况下,实现一个简单的只能话回复。先附一张大致效果图。!(https://oscimg.oschina.net/oscnet/847b9c6272bbacc10e79af12589a96da54e.jpg)下面我们进入代码阶段。(一)修改消息转发器MsgDispatch
Wesley13 Wesley13
3年前
Java微信公众平台开发(十)
转自:http://www.cuiyongzhi.com/post/48.html自定义菜单这个功能在我们普通的编辑模式下是可以直接在后台编辑的,但是一旦我们进入开发模式之后我们的自定义菜单就需要自己用代码实现,所以对于刚开始接触的人来说可能存在一定的疑惑,这里我说下平时我们在开发模式下常用的两种自定义菜单的实现方式:①不用写实现代码,直接用网页测试工具
Wesley13 Wesley13
3年前
Java微信公众平台开发
转自:http://www.cuiyongzhi.com/post/63.html之前发过一个【微信开发】系列性的文章,也引来了不少朋友观看和点评交流,可能我在写文章时有所疏忽,对部分文件给出的不是很完全所以导致部分同学在有些地方做开发的时候遇到了一些阻力,收到这些朋友同学们的咨询反馈之后我也做了一些反思和总结,其中一部分同学说少了GlobalConst
壹立科技 壹立科技
1年前
外卖小程序为何愈发火热?创业者有必要去尝试入局吗?
微信外卖平台系统:即基于微信公众平台的外卖配送系统,用户在外卖小程序中完成自助订餐。并由平台的配送团队进行外卖配送。此外,对于骑手、商家、团队还具有相应的后台系统,相互连接,是一个完整的系统。使用微信小程序作为外卖平台入口的优势:1.开发成本低,连通H5