微信用户授权及企业付款
用户授权
/* *获取微信授权登录的二维码 */ 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; } }