問題描述:
微信的jsapi支付有一個必傳參數(shù)openid,需要使用微信網(wǎng)頁授權接口拿到,但目前微信最多允許設置兩個回調域名全陨。見官方說明:https://pay.weixin.qq.com/wiki/doc/api/jsapi.php?chapter=7_3
解決方案:
設置回調中心轉發(fā)。
解決步驟:
假設你的平臺下有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參數(shù)里的openid和訂單號拌汇,正常發(fā)起jsapi支付。