微信公众号支付官方SDK中jsapi无法获取参数传递的问题
微信支付官方SDK中jsapi.php页面,获取前端订单提交参数进行支付处理,但订单get,post方式提交的参数,需要做一些处理!
在微信中,用户通过公众号或h5页面提交订单至 jsapi.php 文件,页面首先会获取用户openid,如下:
//①、获取用户openid $tools = new JsApiPay(); $openId = $tools->GetOpenid();
再看 GetOpenid() 函数:
/** * * 通过跳转获取用户的openid,跳转流程如下: * 1、设置自己需要调回的url及其其他参数,跳转到微信服务器https://open.weixin.qq.com/connect/oauth2/authorize * 2、微信服务处理完成之后会跳转回用户redirect_uri地址,此时会带上一些参数,如:code * * @return 用户的openid */ public function GetOpenid() { //通过code获得openid if (!isset($_GET['code'])){ //触发微信返回code码 $baseUrl = urlencode('http://'.$_SERVER['HTTP_HOST'].$_SERVER['REQUEST_URI'].$_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请求函数如下:
/** * * 构造获取code的url连接 * @param string $redirectUrl 微信服务器回跳的url,需要url编码 * * @return 返回构造好的url */ 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; }
获取 code 的过程需进行多次交互跳转,因此 jsapi.php 无法直接获取$_GET或者$_POST方式提交的参数,导致页面空白!
解决方案也简单,当用户提交订单时,jsapi页面将获取的参数写入 SESSION 中,在后续需要订单参数时,直接读取SESSION即可。
/* jsapi.php 处理订单参数 */ session_start(); $_SESSION['orderInfo'] = $order; //②、统一下单 读取数据 $order = $_SESSION['orderInfo'];