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