<?php
//  ---------------------------------------------------------------------------------
//    _____   _             _                   _   _____
//   |  __ \ | |           | |    /\           (_) |  __ \
//   | |__) || |__    __ _ | |   /  \    _ __   _  | |__) |_ __  ___
//   |  ___/ | '_ \  / _` || |  / /\ \  | '_ \ | | |  ___/| '__|/ _ \
//   | |     | | | || (_| || | / ____ \ | |_) || | | |    | |  | (_) |
//   |_|     |_| |_| \__,_||_|/_/    \_\| .__/ |_| |_|    |_|   \___/
//                                      | |
//                                      |_|
//   PhalApi Pro 专业版
//   广州果创网络科技有限公司
//
//  ---------------------------------------------------------------------------------
//
//   一、协议的许可和权利
//    1. 您可以在完全遵守本协议的基础上，将本软件应用于商业用途；
//    2. 您可以在协议规定的约束和限制范围内修改本产品源代码或界面风格以适应您的要求；
//    3. 您拥有使用本产品中的全部内容资料、商品信息及其他信息的所有权，并独立承担与其内容相关的
//       法律义务；
//    4. 获得商业授权之后，您可以将本软件应用于商业用途，自授权时刻起，在技术支持期限内拥有通过
//       指定的方式获得指定范围内的技术支持服务；
//
//   二、协议的约束和限制
//    1. 未获商业授权之前，禁止将本软件用于商业用途（包括但不限于企业法人经营的产品、经营性产品
//       以及以盈利为目的或实现盈利产品）；
//    2. 未获商业授权之前，禁止在本产品的整体或在任何部分基础上发展任何派生版本、修改版本或第三
//       方版本用于重新开发；
//    3. 如果您未能遵守本协议的条款，您的授权将被终止，所被许可的权利将被收回并承担相应法律责任；
//
//   三、有限担保和免责声明
//    1. 本软件及所附带的文件是作为不提供任何明确的或隐含的赔偿或担保的形式提供的；
//    2. 会员出于自愿而使用本软件，您必须了解使用本软件的风险，在尚未获得商业授权之前，我们不承
//       诺提供任何形式的技术支持、使用担保，也不承担任何因使用本软件而产生问题的相关责任；
//    3. 广州果创网络科技有限公司不对使用本产品构建的商城中的内容信息承担责任，但在不侵犯会员隐
//       私信息的前提下，保留以任何方式获取会员信息及商品信息的权利；
//
//   有关本产品最终会员授权协议、商业授权与技术服务的详细内容，均由广州果创网络科技有限公司独家
//   提供。广州果创网络科技有限公司拥有在不事先通知的情况下，修改授权协议的权力，修改后的协议对
//   改变之日起的新授权会员生效。电子文本形式的授权协议如同双方书面签署的协议一样，具有完全的和
//   等同的法律效力。您一旦开始修改、安装或使用本产品，即被视为完全理解并接受本协议的各项条款，
//   在享有上述条款授予的权力的同时，受到相关的约束和限制。协议许可范围以外的行为，将直接违反本
//   授权协议并构成侵权，我们有权随时终止授权，责令停止损害，并保留追究相关责任的权力。
//
//  ---------------------------------------------------------------------------------

namespace Base\Model;

use PhalApi\Exception\BadRequestException;

class WeixinApi {
    private static $_wxapiUrl = 'https://api.weixin.qq.com/';
    
    /**
     * 微信wx.login接口
     * 获取微信的openid和sessionKey，之前授权过的可能返回unionid
     * @param $appid
     * @param $secret
     * @param $code
     * @return array|string
     */
    public function wxapiLogin($appid,$secret,$code) {
        $service = 'sns/jscode2session';
        $params = array(
            'appid' => $appid,
            'secret' => $secret,
            'js_code' => $code,
            'grant_type' => 'authorization_code'
        );
        $ret = $this->_send($service,$params);
        if(!empty($ret)) {
            $ret = json_decode($ret,true);
        }
        return $ret;
    }

    /**
     * @link  https://developers.weixin.qq.com/miniprogram/dev/api-backend/open-api/template-message/templateMessage.send.html
     * @function: 模板消息推送
     * @param $appid
     * @param $secret
     * @param $touser
     * @param $template_id
     * @param $page
     * @param $form_id
     * @param $data
     * @param $emphasis_keyword
     * @return array|mixed|string
     */
    public function wxapiTemplateMessageSend($appid,$secret,$touser,$template_id,$page,$form_id,$data,$emphasis_keyword){
        $di = \PhalApi\DI();
        if($di->cache->get('access_token')){
            $access_token = $di->cache->get('access_token');
        }else{
            // 1. 获取access_token
            $accessResult = $this->getAccessToken($appid, $secret);
            if(isset($accessResult['access_token']) && !empty($accessResult['access_token'])){
                $access_token = $accessResult['access_token'];
            }else{
                // 透传获取失败的错误信息
                return $accessResult;
            }
        }
        $service = 'cgi-bin/message/wxopen/template/send?access_token='.$access_token;

        $params = array(
            'touser' => $touser,
            'template_id' => $template_id,
            'page' => $page,
            'form_id' => $form_id,
            'data' => $data,
            'emphasis_keyword' => $emphasis_keyword
        );
        $params = json_encode($params, JSON_UNESCAPED_UNICODE);
        $ret = $this->_send($service,$params,true);

        if(!empty($ret)) {
            $ret = json_decode($ret,true);
        }
        return $ret;
    }

    /**
     * @link https://developers.weixin.qq.com/miniprogram/dev/api-backend/open-api/access-token/auth.getAccessToken.html
     * @function : 获取小程序全局唯一后台接口调用凭据access_token
     * @param $appid
     * @param $secret
     * @param string $grant_type
     * @return array|mixed|string
     */

    public function getAccessToken($appid, $secret, $grant_type = 'client_credential'){
        $service = 'cgi-bin/token';
        $params = array(
            'grant_type' => $grant_type,
            'secret' => $secret,
            'appid' => $appid
        );
        $ret = $this->_send($service,$params);

        if(!empty($ret)) {
            $ret = json_decode($ret,true);
        }
        if(empty($ret) || !isset($ret['access_token'])) {
        }else{
            $expires_in = isset($ret['expires_in']) ? $ret['expires_in'] : '7200';      // 如果没有返回就设置2小时
            // access_token缓存
            $di = \PhalApi\DI();
            $di->cache->set('access_token', $ret['access_token'], $expires_in);
        }
        return $ret;
    }

    /**
     * @link https://developers.weixin.qq.com/miniprogram/dev/api-backend/open-api/sec-check/security.imgSecCheck.html
     * @function : 微信小程序--校验一张图片是否含有违法违规内容。
     * @param $media file 要检测的图片文件，格式支持PNG、JPEG、JPG、GIF，图片尺寸不超过 750px x 1334px
     * @param $appid
     * @param $secret
     */

    public function imgSecCheck($appid,$secret,$imgPath){
        $di = \PhalApi\DI();
        if($di->cache->get('access_token')){
            $access_token = $di->cache->get('access_token');
        }else{
            // 1. 获取access_token
            $accessResult = $this->getAccessToken($appid, $secret);
            if(isset($accessResult['access_token']) && !empty($accessResult['access_token'])){
                $access_token = $accessResult['access_token'];
            }else{
                // 透传获取失败的错误信息
                return $accessResult;
            }
        }
        $service = 'wxa/img_sec_check?access_token='.$access_token;
        $params = array("media" => new \CURLFile($imgPath));
        $ret = $this->_send($service,$params,true);
        if(!empty($ret)) {
            $ret = json_decode($ret,true);
        }
        return $ret;
    }

    /**
     * @link https://developers.weixin.qq.com/miniprogram/dev/api-backend/open-api/sec-check/security.msgSecCheck.html
     * @function : 微信小程序--检查一段文本是否含有违法违规内容。
     * @param $content string 要检测的文本内容，长度不超过 500KB
     * @param $appid
     * @param $secret
     */

    public function msgSecCheck($appid,$secret,$content){
        $di = \PhalApi\DI();
        if($di->cache->get('access_token')){
            $access_token = $di->cache->get('access_token');
        }else{
            // 1. 获取access_token
            $accessResult = $this->getAccessToken($appid, $secret);
            if(isset($accessResult['access_token']) && !empty($accessResult['access_token'])){
                $access_token = $accessResult['access_token'];
            }else{
                // 透传获取失败的错误信息
                return $accessResult;
            }
        }
        $service = 'wxa/msg_sec_check?access_token='.$access_token;
        $params = array(
            'content' => $content
        );

        $ret = $this->_send($service,json_encode($params),true);
        if(!empty($ret)) {
            $ret = json_decode($ret,true);
        }
        return $ret;
    }

    /**
     * @link https://mp.weixin.qq.com/debug/wxadoc/dev/api/api-login.html
     * @param $service
     * @param $params
     * @param null $isPost
     * @param int $timeOut
     * @return array|string
     */
    private function _send($service,$params,$isPost = null,$timeOut = 2000) {
        $ret = array();
        $url = self::$_wxapiUrl.$service;
        try {
            $curl = new \PhalApi\CUrl();

            if(empty($isPost)) {
                $sendUrl = $url.'?'.http_build_query($params);
                // 第二个参数，表示超时时间，单位为毫秒
                $ret = $curl->get($sendUrl, $timeOut);
            }else {
                $ret = $curl->post($url, $params, $timeOut);
            }
        } catch (\PhalApi\Exception\InternalServerErrorException $ex) {
        }
        return $ret;
    }

}
