微信jsapi支付网页授权回调域名限制问题

2019-02-24  本文已影响0人  羽霖z

问题描述:
微信的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支付。

上一篇下一篇

猜你喜欢

热点阅读