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

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

作者: 羽霖z | 来源:发表于2019-02-24 12:03 被阅读0次

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

    相关文章

      网友评论

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

          本文链接:https://www.haomeiwen.com/subject/qimvyqtx.html