本文转载至: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