博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
转载【微信支付】jsapi支付之传参问题(使用微信官方SDK之PHP版本) V3之WxpayPubHelper 亲测有效,V3WxpayAPI_php_v3.zip版未测试,理论上也是一样的。...
阅读量:5036 次
发布时间:2019-06-12

本文共 2307 字,大约阅读时间需要 7 分钟。

本文转载至:http://blog.csdn.net/geeklx/article/details/51146151

(微信支付现在分为v2版和v3版,2014年9月10号之前申请的为v2版,之后申请的为v3版。V3版的微信支付没有paySignKey参数。)

写在最前面: V3 WxpayPubHelper 亲测有效,最新版本(WxpayAPI_php_v3.zip)未测试,理论上也是一样的。

微信支付api真的是各种坑啊

今天一整天都在折腾微信支付jsapi的参数不能通过get,post方式获取的问题!!

微信网页支付在用户点击发起支付前的流程:

 

问题:用户h5页面输入的参数通过post 或者get的方式传递到商户后台,商户后台无法处理用户传入的参数,并生成商户订单。

原因:在创建商户订单时,需要获取到用户的openid

//①、获取用户openid$tools = new JsApiPay();$openId = $tools->GetOpenid();
public function GetOpenid()    {        //通过code获得openid        if (!isset($_GET['code'])){            //触发微信返回code码            $baseUrl = urlencode('http://'.$_SERVER['HTTP_HOST'].$_SERVER['PHP_SELF'].$_SERVER['QUERY_STRING']);            $url = $this->__CreateOauthUrlForCode($baseUrl);            Header("Location: $url");            exit();        } else {            //获取code码,以获取openid            $code = $_GET['code'];            $openid = $this->getOpenidFromMp($code);            return $openid;        }    }

但是在获取用户openid的过程中需要请求CODE,CODE请求函数如下:

private function __CreateOauthUrlForCode($redirectUrl)    {        $urlObj["appid"] = WxPayConfig::APPID;        $urlObj["redirect_uri"] = "$redirectUrl";        $urlObj["response_type"] = "code";        $urlObj["scope"] = "snsapi_base";        $urlObj["state"] = "STATE"."#wechat_redirect";        $bizString = $this->ToUrlParams($urlObj);        return "https://open.weixin.qq.com/connect/oauth2/authorize?".$bizString;    }

因此,在获取openid商户后台与微信系统进行多次交互,当再次回到生成商户订单页的时候,我们之前从h5页面通过$_GET或者$_POST方式获取的参数已经被清空,所以无法生成商户订单。(甚至报错500)

 

解决办法:

1.先将用户h5页面提交过来的参数保存到session中,然后再重定向到要生成商户订单的页面JSpay_redirect.php,例如:

/* order_redirect.php */if(isset($_POST['order'])){       //将所需要的订单id,金额等信息放在全局session中        session_start();         $_SESSION['premoney']=$_POST['premoney'];         ...        Header("Location: JSpay_redirect.php");    }

2.然后在生成商户订单的页面中先获取openid,再获取session中的值,例如:

//①、获取用户openid$tools = new JsApiPay();$openId = $tools->GetOpenid();session_start();$premoney=$_SESSION['premoney'];

3.这样就可以获取到想要自定义支付订单的参数的值了,然后再调用统一下单接口。

 

遇到问题:

1、在微信web开发者工具中一直提示:

  

原因未知,很蛋疼。(解决办法:直接无视,继续你华丽的脚步)

2、在微信web开发者工具中,点击callpay()对应的按钮,调用微信内置的jsapi接口报错:

  

然而在实际手机微信操作,却调用jsapi成功,且能支付、回调成功。原因是开发者工具bug(maybe)。

感谢CSDN的GeeKLV,链接:

http://blog.csdn.net/geeklx/article/details/51146151

 

转载于:https://www.cnblogs.com/xuzhengzong/p/7838338.html

你可能感兴趣的文章
String中各方法多数情况下返回新的String对象
查看>>
浅谈tcp粘包问题
查看>>
UVA11524构造系数数组+高斯消元解异或方程组
查看>>
排序系列之——冒泡排序、插入排序、选择排序
查看>>
爬虫基础
查看>>
jquery.lazyload延迟加载图片第一屏问题
查看>>
HDU 1011 Starship Troopers (树形DP)
查看>>
手把手教你写DI_1_DI框架有什么?
查看>>
.net常见的一些面试题
查看>>
OGRE 源码编译方法
查看>>
上周热点回顾(10.20-10.26)
查看>>
C#正则表达式引发的CPU跑高问题以及解决方法
查看>>
云计算之路-阿里云上:“黑色30秒”走了,“黑色1秒”来了,真相也许大白了...
查看>>
APScheduler调度器
查看>>
设计模式——原型模式
查看>>
【jQuery UI 1.8 The User Interface Library for jQuery】.学习笔记.1.CSS框架和其他功能
查看>>
如何一个pdf文件拆分为若干个pdf文件
查看>>
web.xml中listener、 filter、servlet 加载顺序及其详解
查看>>
前端chrome浏览器调试总结
查看>>
获取手机验证码修改
查看>>