微信支付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方式获取的参数已经被清空,所以无法生成商户订单。
解决办法:
1.先将用户h5页面提交过来的参数保存到session中,然后再重定向到要生成商户订单的页面JSpay_demo.php,例如:
/* order_demo.php */
if(isset($_POST['order'])){
$_SESSION['premoney']=$_POST['premoney'];
Header("Location: JSpay_demo.php");
}2.然后在生成商户订单的页面中先获取openid,再获取session中的值,例如:
//①、获取用户openid
$tools = new JsApiPay();
$openId = $tools->GetOpenid();
session_start();
$premoney=$_SESSION['premoney'];3.这样就可以获取到想要自定义支付订单的参数的值了,然后再调用统一下单接口。
本文介绍了微信支付jsapi参数传递遇到的问题及解决方案。在用户通过H5页面发起支付时,由于参数无法通过GET或POST传递给商户后台以生成订单,因为创建订单需获取openid。解决办法是将用户参数暂存到session,然后重定向到订单生成页面,从而确保参数正确处理。
4419

被折叠的 条评论
为什么被折叠?



