问题描述:
微信的jsapi支付有一个必传参数openid,需要使用微信网页授权接口拿到,但目前微信最多允许设置两个回调域名。见官方说明:https://pay.weixin.qq.com/wiki/doc/api/jsapi.php?chapter=7_3
解决方案:
设置回调中心转发。
解决步骤:
假设你的平台下有5个域名需要jsapi支付,a.com,b.com,c.com,d.com.e.com,其中a.com,b.com在公众号后台设置了回调域名,
我们在a.com下建立回调中心。
1 修改c.com,d.com,e.com三个域名下获取openid的代码,把回调地址改成a.com下的回调中心的地址:
以官方的sdk下的demo为例子,修改 Wxpay.jsApiPay.php,
public function GetOpenid($order_no = '')
{
//通过code获得openid
if (!isset($_GET['code'])){
//redirectUrl设置为a后台回调中心的的地址,并标记order_no和platform(最终需要跳转回哪个平台)
$redirectUrl = "https://a.com/WeixinOpenidCenter/index?order_no=".$order_no."&platform=c";
$baseUrl = urlencode($redirectUrl);
$url = $this->_CreateOauthUrlForCode($baseUrl);
return array('type'=>'url','url'=>$url);
} else {
//获取code码,以获取openid
$code = $_GET['code'];
$openid = $this->GetOpenidFromMp($code);
return $openid;
}
}
2 在a.com下建立WeixinOpenidCenter控制器,代码如下:
class WeixinOpenidCenterController extends Controller{
/**
* openid公共回调中心
* @return [type]
*/
public function index(){
//引入官方包的代码...
require_once APP_PATH."/sdk路径/WeChat/lib/WxPay.Api.php";
require_once APP_PATH."/sdk路径/WeChat/example/WxPay.JsApiPay.php";
require_once APP_PATH."/sdk路径/WeChat/example/WxPay.Config.php";
require_once APP_PATH."/sdk路径/WeChat/example/log.php";
require_once APP_PATH."/sdk路径t/WeChat/config.php";
$logHandler= new \CLogFileHandler(APP_PATH."/sdk路径/WeChat/logs/".date('Y-m-d').'.log');
$log = \Log::Init($logHandler, 15);
//①、获取用户openid
try{
$tools = new \JsApiPay();
$openId = $tools->GetOpenid(); // 当前位置处于回调中心,微信会携带着code重定向到当前地址,所以GetOpenid方法会直接拿到opendid.
if($openId){
//跳转到相应后台
$platform = trim($_GET['platform']); // 记录需要把openid回传给哪个域名
$order_no = trim($_GET['order_no']); // 记录目标域名平台下的订单号
if(!$openId && !$order_no){
$this->error('无效的订单');
die;
}
//携带openid和订单号回传给目标域名
if($platform == 'c'){
$url = "https://c.com/Recharge/jsapiPay?openid=".$openId."&order_no={$order_no}";
}elseif ($platform == 'd') {
$url = "https://d.com/Recharge/jsapiPay?openid=".$openId."&order_no={$order_no}";
}elseif ($platform == 'e') {
$url = "https://e.com/Recharge/jsapiPay?openid=".$openId."&order_no={$order_no}";
}
header("Location:{$url}");
die;
}
} catch(Exception $e) {
\Log::DEBUG(json_encode($e));
}
}
}
3 目标域名下的Recharge/jsapiPay接收get参数里的openid和订单号,正常发起jsapi支付。