微信公众号支付官方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'];