由于公司项目的需要,需要在项目里整合微信支付,公司原有的项目中已有老版本的支付功能,在此不作讨论。我需要作的就是加入新版本的支付功能

让项目里可以支持新老两种版本的功能。在微信官方下载到了新版支付的php版sdk,看到 WxPay.ub.config.php,SDKRuntimeException.php, WxPayPubHelper.php

三个文件。我需要改造的就是WxPayPubHelper.php这个文件,因为这个文件现在是单用户配置的,所以我要让它变成多用户的,在改造的过程中遇到了几点问题,也是大家

可能会经常遇到的,在这分享出来,希望能给他人一些帮助。

q1:redirect_uri 参数错误的问题 !

这个问题出现的比例比较大,在sdk包里有一个demo的文件夹,里面有一个js_api_call.php文件,在他的13行里有如下代码:

 //使用jsapi接口$jsApi = new JsApi_pub();//=========步骤1:网页授权获取用户openid============//通过code获得openidif (!isset($_GET['code'])){//触发微信返回code码$url = $jsApi->createOauthUrlForCode(WxPayConf_pub::JS_API_CALL_URL);Header("Location: $url"); }else{//获取code码,以获取openid$code = $_GET['code'];$jsApi->setCode($code);$openid = $jsApi->getOpenId();}
$url = $jsApi->createOauthUrlForCode(WxPayConf_pub::JS_API_CALL_URL);

这一句就是设置redirect_uri参数的地方,我把它改造成了自己的地址,代码如下:

$url = $jsApi->createOauthUrlForCode( $site_domain.base64_decode($_GET['uri']));

为什么要用base64编码呢,因为我的url是像这样的 :

index.php?g=Wap&m=Wxpay&a=newpay&token=$1&wecha_id=$2&orderid=$3

这个url又臭又长,而且很多&符,无法识别出哪部分是自己的url了,还有最重要的部分 WxPayHubHelper.php在大概822行的部分,有一个方法叫createOauthUrlForCode($redirectUrl),这个里面的$url这个变量没有进行url编码,请自己加一下,否则你的url里有参数将不能正常被识别,代码很简单:

$url = urlencode($redirectUrl); 这样就行。

进行了以上的设置后如果还出现redirect_uri的错误的话就要考虑你的支付路径权限的问题了,进入微信公众号的后台,请确保你的是服务号,并且已认证,查看方法是页面右上角。在确认了之后  点左侧菜单的 “开发者中心”,然后如图:

点击修改,填入“授权回调页面域名”,请确保这个域名和你的应用域名一致,这样应该就解决了这个问题。

q2:无法获取prepay_id的问题

首选请确保你 WxPayPubHelper.php这个文件里 UnifiedOrder_pub 这个类的getPrepayId这个方法能正常使用。

此方法代码如下:

 /*** 获取prepay_id*/function getPrepayId(){$this->postXml();$this->result = $this->xmlToArray($this->response);$prepay_id = $this->result["prepay_id"];return $prepay_id;}

查看posXml这个方法后发现调用了自己的createXml这个方法

postXml方法如下:

 /***    作用:post请求xml*/function postXml(){$xml = $this->createXml();$this->response = $this->postXmlCurl($xml,$this->url,$this->curl_timeout);return $this->response;}

这时需要确认你的$xml这个变量形式如下:

<xml><openid><![CDATA[o-aubjtEkotIj_GNXXXXqV8_XXXXX]]></openid>
<body>201501201705551389</body>
<out_trade_no><![CDATA[wx7143c4a87a86c8ac142174XXX]]></out_trade_no>
<total_fee>1</total_fee>
<notify_url><![CDATA[http://demo.com/paydemo/demo/notify_url.php]]></notify_url>
<trade_type><![CDATA[JSAPI]]></trade_type>
<appid><![CDATA[wx7143c4axxxxxxxx]]></appid>
<mch_id>10020230</mch_id>
<spbill_create_ip><![CDATA[192.168.1.110]]></spbill_create_ip>
<nonce_str><![CDATA[imfgrg1g2odbl6mbiacmlkxxxxxxx]]></nonce_str>
<sign><![CDATA[CBE62F36806A3E1D98CB2311XXXXXX]]></sign></xml>

尤其注意 openid的形式一定要类似这样的,全是数字或全是字母的一定是错误

然后postXmlCurl才能正确提交,提交后就能得到正确的prepay_id了

q3:在取到了prepay_id后,在进行付款的时候提示:公众号支付使用了无效的商户号

这个问题大部分是出现在二次签名的时候,由于第二次签名和第一次签名不一致导致的

这时我们需要看WxPayPubHelper.php这个文件里的JsApi_pub这个类,这个类中的getParameters这个方法是进行第二次签名的关键,代码如下:

 /***    作用:设置jsapi的参数*/public function getParameters(){$jsApiObj["appId"] = WxPayConf_pub::APPID;$timeStamp = time();$jsApiObj["timeStamp"] = "$timeStamp";$jsApiObj["nonceStr"] = $this->createNoncestr();$jsApiObj["package"] = "prepay_id=$this->prepay_id";$jsApiObj["signType"] = "MD5";$jsApiObj["paySign"] = $this->getSign($jsApiObj);$this->parameters = json_encode($jsApiObj);return $this->parameters;}

由于我需要根据数据表里的设置来动态的调用key,所以我的这个签名要符合多个商家的,代码改动如下:

 /***    作用:设置jsapi的参数*/public function getParameters(){$jsApiObj["appId"] = $this->config['appid'];$timeStamp = time();$jsApiObj["timeStamp"] = "$timeStamp";$jsApiObj["nonceStr"] = $this->createNoncestr();$jsApiObj["package"] = "prepay_id=$this->prepay_id";$jsApiObj["signType"] = "MD5";$jsApiObj["paySign"] = $this->getSign($jsApiObj, $this->config['key']);$this->parameters = json_encode($jsApiObj);return $this->parameters;}

getSign这个方法原型不帖了,改动后如下:

 /***    作用:生成签名*/public function getSign($Obj, $key =''){foreach ($Obj as $k => $v){$Parameters[$k] = $v;}//签名步骤一:按字典序排序参数ksort($Parameters);$String = $this->formatBizQueryParaMap($Parameters, false);//echo '【string1】'.$String.'</br>';//签名步骤二:在string后加入KEYif ($key!='') {$String = $String."&key=".$key;}else{$String = $String."&key=".WxPayConf_pub::KEY;}//echo "【string2】".$String."</br>";//签名步骤三:MD5加密$String = md5($String);//echo "【string3】 ".$String."</br>";//签名步骤四:所有字符转为大写$result_ = strtoupper($String);//echo "【result】 ".$result_."</br>";return $result_;}

可以看到,我只是多加了一个参数,加了一个判断,因为我不想过多的破坏原来的代码,所以这样加了。

在这样的改造完成后,我遇到的问题都解决了。希望对正在看的你能有所帮助,如果还有问题可以给我留言!

关于微店整合微信支付时出现的的各种问题的记录 php版相关推荐

  1. 微信服务号开发-整合微信支付

    最近的项目在对接微信支付,所以抽出一些时间,将方法总结一下: 欢迎加群交流:724225958 官方开发文档:https://pay.weixin.qq.com/wiki/doc/api/jsapi. ...

  2. Springboot----项目整合微信支付(引入延迟队列实现订单过期取消以及商户主动查单)

    前言 目前更新的是Springboot项目整合微信支付系列的文章,可以在我的主页中找到该系列其他文章,这一系列的文章将会系统介绍如何在项目中引入微信支付的下单.关单.处理回调通知等功能.由于前面创作经 ...

  3. SpringBoot整合微信支付开发在线教育视频网站(完整版)

    目录 ├─code.zip ├─第 1 章项目介绍和前期准备 │  ├─1-1 SpringBoot整合微信支付开发在线教育视频站点介绍.TS │  ├─1-2 中大型公司里面项目开发流程讲解.TS ...

  4. 微信支付php详解 php,ThinkPHP框架整合微信支付之刷卡模式图文详解

    本文实例讲述了ThinkPHP框架整合微信支付之刷卡模式.分享给大家供大家参考,具体如下: 大家好,这篇文章是继微信支付之Native 扫码支付 模式二之后的微信支付系列教程第四篇:微信刷卡支付 本教 ...

  5. 微信开发 - 第三方网站接入微信登录、微信支付时,本地 redirect_uri 参数错误导致无法调试的解决方案(微信开放平台)完美解决每次都需要部署到线上测试,在本地使用本地 ip 就能轻松调试

    问题描述 网上的教程都非常乱且无效,本文将站在新手的角度,超级详细的讲解. 本文提供 在微信开放平台,接入微信登录和微信支付时,本文无法调试 redirect_uri 回调错误 的解决方案, 仅需几个 ...

  6. 苹果手机 微信PHP问题,安卓、ios APP调用微信支付时,页面出现空白 。(php微信支付,app发起微信支付白屏)?...

    安卓.ios APP调用微信支付时,页面出现空白 我的后端是用php开发的.我是先调用微信的统一下单生成,生成prepay_id预支付订单号,代码如下: public function send_pa ...

  7. 【原创】微信支付遇到的各种坑及解决方案随笔记录,invalid signature, “errMsg“:“chooseWXPay:fail“

    [原创]微信支付遇到的各种坑及解决方案随笔记录,invalid signature, "errMsg":"chooseWXPay:fail" 参考文章: (1) ...

  8. Thinkphp3.2整合微信支付

    2019独角兽企业重金招聘Python工程师标准>>> [2016/08/04]本篇文章內容沒有在維護了,一年前寫下來的不知道微信的接口有沒有改變,想要實際應用的可以看下白俊遥 朋友 ...

  9. Thinkphp整合微信支付功能

    1.微信公众号: 独特的appid.appscrect.接口权限之中设置可以获取用户ID信息权限的域名(每个用户对于不同公众都会有一个特有ID,通过这个ID获取用户微信账号基本信息.详情看微信开发者文 ...

最新文章

  1. python数据库gui_从python数据库在gui上打印数据
  2. 综述:目标检测二十年
  3. codeforces round25
  4. 【Linux系统编程】进程和线程的区别
  5. 【转】细说.NET 中的多线程 (一 概念)
  6. php 根据数量创建数组,php实现根据字符串生成对应数组的方法
  7. 关于vue3.0中的this.$router.replace({ path: '/'})刷新无效果问题
  8. python关键字参数可以避免什么问题_python入门课|Python关键字参数使用方法公布,能解决80%的python函数问题...
  9. 安卓手机安装并使用自动化应用Tasker
  10. 客快物流大数据项目(三):项目解决方案
  11. java中uri与url的区别_URL和URI的区别与总结
  12. 邮件营销EDM运营笔记:选择合适的EDM平台
  13. 文件 打包 及 生成Excel文件转PDF格式和Excsl文件格式一体数据
  14. 直方图都看不懂,怎么可能拍出好照片!
  15. Windows 下使用anaconda虚拟环境pip install 安装pytorch出现报错There was a problem confirming the ssl certificate
  16. 纳米表征技术 2022.10.5
  17. 动易如何预防ASP木马防止网页被黑
  18. 【Linux】修改腾讯云轻量应用服务器的hostname
  19. 我的世界服务器java进不去_萌新求助 mc服务器进不去
  20. EtherCAT DC (学习笔记)

热门文章

  1. Erlang rpc.erl 的学习记录
  2. 大学生在线“打假”,火速开发了一款拆穿 AI 的神器
  3. 癫痫脑电数据集-波士顿儿童医院
  4. Java 从零开始实现一个画图板、以及图像处理功能,代码可复现
  5. 数字化车间的产品全生命周期信息追溯
  6. uc/os-ii 互斥信号量及mutex.c源码分析
  7. 图文解读:推荐算法架构——精排!
  8. 获取iTunes账号与iCloud账号区别
  9. 三维体数据分割算法及实现
  10. 中睿微课堂 | 伪装成简历的攻击样本,各位HR小伙伴需要注意啦