微信用户授权及企业付款

微信用户授权及企业付款
  • 用户授权

        /*
         *获取微信授权登录的二维码
         */
        public function my_withdraw(){
            $system = M("system")->where(["id"=>1])->find();
            $redirect_uri ='http%3a%2f%2fbaidui.tstmobile.com%2findex.php%3fm%3dOpera%26c%3dCaiwu%26a%3ddomy_withdraw';
            $url = "https://open.weixin.qq.com/connect/qrconnect?appid=".$this->appid."&redirect_uri=".$redirect_uri."&response_type=code&scope=snsapi_login&state=STATE#wechat_redirect";
            header("Location: ".$url);
        }
        //微信回调地址(获取用户的相关信息)
        public function domy_withdraw(){
            //获取code
            $code = ($_GET["code"]);
            //通过code获取access_token
            $url = "https://api.weixin.qq.com/sns/oauth2/access_token?appid=" . $this->appid ."&secret=" . $this->appsecret. "&code=" .$code  . "&grant_type=authorization_code";
            $result = $this->curl_get($url);
            $arr = json_decode($result, true);
            $url1 = "https://api.weixin.qq.com/sns/oauth2/refresh_token?appid=" . $this->appid . "&grant_type=refresh_token&refresh_token=" . $arr['refresh_token'];
            $arr1 = $this->curl_get($url1);
            $arr1 = json_decode($arr1, true);
            $url2 = "https://api.weixin.qq.com/sns/userinfo?access_token=" . $arr1['access_token'] ."&openid=" . $this->appid ."&lang=zh_CN";
            $arr2 = $this->curl_get($url2);
            $arr2 = json_decode($arr2, true);
            $openid = $arr['openid'];
            //获取代理商center_id
            $fid = $_SESSION["opera"]["center_id"];
            if(!empty($openid)){
                $data['uptime'] = time();
                $res = M("center")->where(["openid"=>$openid,"center_id" => $fid])->find();
                if($res){
                    $update_res = M("center")->where(["center_id"=>$fid])->save($data);
                }else{
                    $data["wx_img"] = $arr2["headimgurl"];
                    $data['openid'] = $openid;
                    $data['wx_nickname'] = $arr2['nickname'];
                    $update_res = M("center")->where(["center_id"=>$fid])->save($data);
                }
                if($update_res){
                    $this->success('提现账号绑定成功',U('Index/index'));
                }else{
                    $this->success('提现账号绑定失败', U('Index/index'));
                }
            }
        }
  • 微信公众公众号授权登录

     private $appid="***";
    private $appsecret="***";
    /*
     *获取微信授权登登录
     */
    public function wx_authorization(){
        $redirect_uri ='http%3a%2f%2fdspx.tstmobile.com%2fapi%2flogin%2fwx_callback';
        $url = "https://open.weixin.qq.com/connect/oauth2/authorize?appid=".$this->appid."&redirect_uri=".$redirect_uri."&response_type=code&scope=snsapi_userinfo&state=STATE#wechat_redirect";
        header("Location: ".$url);
    }
    //微信回调地址(获取用户的相关信息)
    public function wx_callback ()
    {
        //获取code
        $code = ($_GET["code"]);
        //通过code获取access_token
        $url = "https://api.weixin.qq.com/sns/oauth2/access_token?appid=" . $this->appid . "&secret=" . $this->appsecret . "&code=" . $code . "&grant_type=authorization_code";
        $result = curl_get($url);
        $arr = json_decode($result, true);
        $url1 = "https://api.weixin.qq.com/sns/oauth2/refresh_token?appid=" . $this->appid . "&grant_type=refresh_token&refresh_token=" . $arr['refresh_token'];
        $arr1 = curl_get($url1);
        $arr1 = json_decode($arr1, true);
        $url2 = "https://api.weixin.qq.com/sns/userinfo?access_token=" . $arr1['access_token'] . "&openid=" . $this->appid . "&lang=zh_CN";
        $arr2 = curl_get($url2);
        $openid = $arr['openid'];
        if (!empty($openid)) {
            $check = DB::name("user")->where(["openid" => $openid])->find();
            if (!$check) {
                $arr2 = json_decode($arr2, true);
                $data['openid'] = $openid;
                $data['token'] = uniqid();
                $data['intime'] = date("Y-m-d H:i:s", time());
                $data['username'] = $arr2['nickname'];
                $data['img'] = $arr2['headimgurl'];
                $data['sex'] = $arr2['sex'];
                $data['province'] = $arr2['province'];
                $data['city'] = $arr2['city'];
                $result = DB::name("user")->insert($data);
                $this->api_return("201","登录成功");
            } else {
                $this->api_return("201","登录成功");
            }
        }else{
            $this->api_return("404","授权失败");
        }
  • 企业付款

    <?php
    namespace Admin\Controller;
    use PMA\libraries\URL;
    
    class WxapiController extends CommonController{
        public function __initilize(){
            parent::_initialize();
        }
        const URL = "https://api.mch.weixin.qq.com/mmpaymkttransfers/promotion/transfers"; //企业付款接口地址
        /**
         * TODO:设置商户证书路径
         * 证书路径,注意应该填写绝对路径,发送红包和查询需要,可登录商户平台下载
         * API证书下载地址:https://pay.weixin.qq.com/index.php/account/api_cert,下载之前需要安装商户操作证书)
         * @var path 跟这个文件同一目录下的cert文件夹放置证书!!!!
         */
        const SSLCERT_PATH = 'cert/apiclient_cert.pem';
        const SSLKEY_PATH = 'cert/apiclient_key.pem';
        //相关配置参数
        private $mch_appid = "wx6cxxxa4105"; //企业appid
        private $appSecret ="dbe09xxxd3742b956b8bc";//$appSecret
        private $mchid = "146xxxx02"; //商户号
        private $apikey = "xxxxxxx";//商户秘钥
        //进行提现操作
        public function actionAct_tixian(){
            $withdraw_record_id = I("withdraw_record_id");
            $res = M("withdraw_record")->where(["withdraw_record_id" =>$withdraw_record_id])->find();
            if(!$res){
                var_dump("error");
                //$this->error("付款失败");
            }
            $nonce_str = $this->getRand(30, 3); //随机字符串
            $partner_trade_no = $this->geto;//商户订单号
            $check_name = "NO_CHECK";//校验用户姓名选项
            $re_user_name= $res["wx_nickname"];//收款人姓名
            $amount= $res["amount"]; //收款金额
            $desc = "xxx"; //描述
            $spbill_create_ip = $this->getServerIp();//ip
            $openid = $res["openid"];//用户openid
            $partner_trade_no = $this->getPartnerTradeNo();
    
            //进行签名
            $content = "amount=".$amount."&check_name=".$check_name."&desc=".$desc."&mch_appid=".$this->mch_appid."&mchid=".$this->mchid."&nonce_str=". $nonce_str."&openid=".$openid.
                "&partner_trade_no=".$partner_trade_no."&re_user_name=".$re_user_name."&spbill_create_ip=".$spbill_create_ip;
            $sign = $this->_sign($content,$this->apikey);
            $xml= '<xml>';
            $xml .= "<mchid>".$this->mchid."</mchid>";
            $xml .= "<mch_appid>".$this->mch_appid."</mch_appid>";
            $xml .= "<nonce_str>".$this->getPartnerTradeNo()."</nonce_str>";
            $xml .= "<partner_trade_no>".$partner_trade_no."</partner_trade_no>";
            $xml .= "<openid>".$openid."</openid>";
            $xml .= "<check_name>".$check_name."</check_name>";
            $xml .= "<re_user_name>".$re_user_name."</re_user_name>";
            $xml .= "<amount>".$amount."</amount>";
            $xml .= "<desc>".$desc."</desc>";
            $xml .= "<spbill_create_ip>".$spbill_create_ip."</spbill_create_ip>";
            $xml .= "<sign>".$sign."</sign>";
            $xml .= "</xml>";
            $resultObj = simplexml_load_string($xml, 'SimpleXMLElement', LIBXML_NOCDATA);
            $result = $this->curl_post_ssl(URL,$xml);
            if(!$result){
                return false;
            }
            //解析xml
             $resultObj = simplexml_load_string($result, 'SimpleXMLElement', LIBXML_NOCDATA);
            if($resultObj->return_code =="SUCCESS"){
                //成功后的操作
            }
        }
        /**
         * cURL抓取
         *
         * @param $url 链接地址
         * @param $vars 参数
         * @param  $second
         * @param  $aHeader
         * @return mixed|boolean
         */
        function curl_post_ssl($url, $data, $second = 30, $aHeader = array())
        {
            $ch = curl_init();
            // 超时时间
            curl_setopt($ch, CURLOPT_TIMEOUT, $second);
            curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
            // 这里设置代理,如果有的话
            curl_setopt($ch, CURLOPT_URL, $url);
            curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
            curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, false);
            // cert 与 key 分别属于两个.pem文件
            curl_setopt($ch, CURLOPT_SSLCERT, $this->_cert['api_cert']);
            curl_setopt($ch, CURLOPT_SSLKEY, $this->_cert['api_key']);
            curl_setopt($ch, CURLOPT_CAINFO, $this->_cert['rootca']);
            if (count($aHeader) >= 1) {
                curl_setopt($ch, CURLOPT_HTTPHEADER, $aHeader);
            }
            curl_setopt($ch, CURLOPT_POST, 1);
            curl_setopt($ch, CURLOPT_POSTFIELDS, $data);
            $data = curl_exec($ch);
            if ($data) {
                curl_close($ch);
                return $data;
            } else {
    //            $this->log(json_encode($this->_cert));
    //            $this->error = 'aa:'.curl_errno($ch);
                curl_close($ch);
                return false;
            }
        }
        /**
         * 签名
         *  @param $content 签名的字符串
         * @param $key 密钥
         * @throws Exception
         * @return string|boolean
         */
        private function _sign($content,$key){
            try {
                if (null == $key) {
                    $this->error = '签名key不能为空!';
                    return false;
                }
                if (null == $content) {
                    $this->error = '签名内容不能为空';
                    return false;
                }
                $signStr = $content . "&key=" . $key;
    
                return strtoupper(md5($signStr));
    
            } catch (Exception $e) {
                $this->error = $e->getMessage();
                return false;
            }
        }
        /**
         * 获取服务器ip
         * @return string
         */
        private function getServerIp()
        {
            $server_ip = '127.0.0.1';
            if (isset($_SERVER)) {
                if (isset($_SERVER['SERVER_ADDR']) && $_SERVER['SERVER_ADDR']) {
                    $server_ip = $_SERVER['SERVER_ADDR'];
                } elseif (isset($_SERVER['LOCAL_ADDR']) && $_SERVER['LOCAL_ADDR']) {
                    $server_ip = $_SERVER['LOCAL_ADDR'];
                }
            } else {
                $server_ip = getenv('SERVER_ADDR');
            }
            return $server_ip;
        }
        /**
         * 获取随机数
         * @param number $len 随机数的位数
         * @param number $type 取值范围 1表示数字 2小写字母 4大写字母
         * @return string
         */
        public function getRand($len = 30, $type = 0)
        {
            $str = '';
            $max = - 1;
    
            if (! $type) {
                $type = 3;
            }
    
            if ($type & 1) {
                $str .= '1234567890';
                $max += 10;
            }
    
            if ($type & 2) {
                $str .= 'abcdefghijklmnopqrstuvwxyz';
                $max += 26;
            }
    
            if ($type & 4) {
                $str .= 'ABCDEFGHIJKLMNOPQRSTUVWXYZ';
                $max += 26;
            }
    
            $rand = '';
            for ($i = 0; $i < $len; $i ++) {
                $rand .= $str[rand(0, $max)];
            }
            return $rand;
        }
    
        /**
         * 生成商户的订单号
         * @return string
         */
        public function getPartnerTradeNo()
        {
            $partner_trade_no = $this->mchid . date('YmdHis') . $this->getRand(4, 1); // $this->getRandNum();
            return $partner_trade_no;
        }
    }

    相关文档参考文档

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值