您好,登錄后才能下訂單哦!
微信現(xiàn)金紅包接口實(shí)現(xiàn)紅包發(fā)放:
一:流程:【
流程:微信用戶(hù)訪(fǎng)問(wèn)紅包活動(dòng)頁(yè)面--》后端判斷是否是微信訪(fǎng)問(wèn)的
【否:提示用微信打開(kāi)連接,是:提示用戶(hù)是否授權(quán)允許,獲取其的用戶(hù)信息【openID等信息】】--》
進(jìn)入紅包活動(dòng)頁(yè)面---》用戶(hù)點(diǎn)擊領(lǐng)取紅包【判斷是否領(lǐng)取過(guò)紅包】是:【提示已領(lǐng)取過(guò)紅包】否
--》后端程序調(diào)用接口發(fā)放紅包
--》微信用戶(hù)在微信中收到紅包
--》打開(kāi)紅包
--》紅包金額會(huì)添加到錢(qián)包零錢(qián)里
--》完成紅包發(fā)放。
】
二:要實(shí)現(xiàn)微信現(xiàn)金紅包接口實(shí)現(xiàn)紅包發(fā)放,首先要符合以下條件:
1.用于發(fā)放紅包的微信公眾號(hào)要是服務(wù)類(lèi)型
2.登錄微信公眾平臺(tái)官網(wǎng)后,在公眾平臺(tái)后臺(tái)管理頁(yè)面 - 開(kāi)發(fā)者中心頁(yè),
點(diǎn)擊“修改配置”按鈕,填寫(xiě)服務(wù)器地址(URL)、Token和EncodingAESKey,
其中URL是開(kāi)發(fā)者用來(lái)接收微信消息和事件的接口URL。Token可由開(kāi)發(fā)者可以任意填寫(xiě),
用作生成簽名(該Token會(huì)和接口URL中包含的Token進(jìn)行比對(duì),從而驗(yàn)證安全性)。
EncodingAESKey由開(kāi)發(fā)者手動(dòng)填寫(xiě)或隨機(jī)生成,將用作消息體加解密密鑰。
3.獲取access_token:公眾號(hào)可以使用AppID和AppSecret調(diào)用本接口來(lái)獲取access_token。
【AppID和AppSecret可在微信公眾平臺(tái)官網(wǎng)-開(kāi)發(fā)者中心頁(yè)中獲得(需要已經(jīng)成為開(kāi)發(fā)者,且?guī)ぬ?hào)沒(méi)有異常狀態(tài))?!?/p>
4.微信公眾號(hào)要開(kāi)通 “網(wǎng)頁(yè)授權(quán)接口” 用戶(hù)獲取用戶(hù)基本信息【特別是openID ,發(fā)紅包時(shí)用到】
5.微信公眾號(hào)的 “微信支付“ 中的 ”商戶(hù)號(hào)” 要開(kāi)通微信支付【發(fā)紅包的金額是該支付賬戶(hù)扣款】,開(kāi)通“現(xiàn)金紅包”接口【調(diào)用該接口發(fā)放紅包】。
6. 登陸 ”商戶(hù)號(hào)”【微信公眾號(hào)分配的商戶(hù)號(hào)。第5 中有說(shuō)明】 在 “API安全” 中 下載PHP版的 證書(shū) 【.pem格式】
以上如描述不清楚,請(qǐng)查看 微信開(kāi)發(fā)者文檔 里面有詳細(xì)的秒殺。
部分代碼如下【其余的請(qǐng)查看附件】:
<?php namespace RedClient\Controller; use Think\Controller; use RedClient\Redpack\WeiXinInfo; use RedClient\Redpack\Oauth; use RedClient\Redpack\SendRedPack; use RedClient\Redpack\CreateRedPack; class IndexController extends Controller { public function index() { $this->isWeixin();//是否是微信打開(kāi) if($this->access) { $this->display(); } else { $class=new Oauth(); $class->index('http://www.myweb.com/index.php/Index/oauth'); } } //獲取用戶(hù)信息 openID public function oauth() { $code=isset($_GET['code'])?strip_tags(trim($_GET['code'])):''; $state=isset($_GET['state'])?strip_tags(trim($_GET['state'])):''; $class=new Oauth(); $userInfo=$class->getCode($code,$state);//獲取用戶(hù)信息 if(!empty($userInfo['data'])) { //$model=M('wxuser'); //$result=$model->where('openid = "'.$userInfo['data']->openid.'"')->field('openid')->select(); if(empty($result)) { $userInfo['data']=$this->object2array($userInfo['data']); $model->data($userInfo['data'])->add(); } } $userInfo['data']=$this->object2array($userInfo['data']); //創(chuàng)建紅包 $class=new CreateRedPack(); $red=$class->redval(); //發(fā)紅包 $class=new SendRedPack(); $configs=array( 'send_name'=>'紅包發(fā)送者名稱(chēng)',//紅包發(fā)送者名稱(chēng) 're_openid'=>$userInfo['data']['openid'],//接受紅包的用戶(hù),用戶(hù)在wxappid下的openid 'total_amount'=>$red,//付款金額,單位分 'total_num'=>'1',//紅包發(fā)放總?cè)藬?shù) 'wishing'=>'紅包祝福語(yǔ)',//紅包祝福語(yǔ) 'client_ip'=>$_SERVER['SERVER_ADDR'],//調(diào)用接口的機(jī)器Ip地址 'act_name'=>'活動(dòng)名稱(chēng)',//活動(dòng)名稱(chēng) 'remark'=>'備注信息',// 備注信息 ); $class->setFields($configs); $result=$class->requestXml(); //微信返回信息處理 if(strtoupper($result['return_code'])=='SUCCESS') { if(strtoupper($result['result_code'])=='SUCCESS') { //紅包發(fā)送成功! $datas['flag']=1; echo $result['err_code_des']; } else { //紅包發(fā)送失敗 $datas['flag']=0; $datas['msg']=$result['err_code_des']; echo $result['err_code_des']; } } else { //紅包發(fā)送失敗 $datas['flag']=0; $datas['msg']=$result['err_code_des']; echo $result['err_code_des']; } } public function isWeixin() { if (strpos($_SERVER['HTTP_USER_AGENT'], 'MicroMessenger') !== false) { $this->access=true; } return false; } //類(lèi)轉(zhuǎn)換成數(shù)組 public function object2array($object) { if (is_object($object)) { foreach ($object as $key => $value) { $array[$key] = $value; } } else { $array = $object; } return $array; } } ?>
<?php namespace RedClient\Redpack; /** 簡(jiǎn)單紅包算法類(lèi) **/ class CreateRedPack { private $rid=0;//當(dāng)前紅包隨機(jī)數(shù) private $rand_arr=array();//35%是1.0到1.1 紅包隨機(jī)數(shù) private $rand_arr1=array();//35%是1.1到1.2 紅包隨機(jī)數(shù) private $rand_arr2=array();//30%是1.2到1.95 紅包隨機(jī)數(shù) private $red=0;//紅包金額 private $simplered=0; private $red_config=array( array('min'=>1.0,'max'=>1.1), array('min'=>1.1,'max'=>1.2), array('min'=>1.2,'max'=>1.95) ); public function __construct() { $this->rid=mt_rand(1,10000);//當(dāng)前紅包隨機(jī)數(shù) $this->rand_arr=range(1,3500);//35%是1.0到1.1 $this->rand_arr1=range(3501,7000);//35%是1.1到1.2 $this->rand_arr2=range(7001,10000);//30%是1.2到1.95 $this->simplered=666; } public function redval() { $maxrp=$this->maxred();//隨機(jī)最大紅包金額 if($maxrp!=$this->simplered) { if(in_array($this->rid,$this->rand_arr)) { $red_val=$this->red_config[0]; $min=$red_val['min']*100; $max=$red_val['max']*100; $this->red=mt_rand($min,$max); $this->red=$this->red/100; } elseif(in_array($this->rid,$this->rand_arr1)) { $red_val=$this->red_config[1]; $min=$red_val['min']*100; $max=$red_val['max']*100; $red=mt_rand($min,$max); $this->red=$this->red/100; } elseif(in_array($this->rid,$this->rand_arr2)) { $red_val=$this->red_config[2]; $min=$red_val['min']*100; $max=$red_val['max']*100; $this->red=mt_rand($min,$max); $this->red=$this->red/100; } } else { $this->red=$maxrp; } return $this->red?$this->red:1; } protected function maxred() { $rid=mt_rand(1,100000); $rid1=mt_rand(1,100000); $red=0; $dff=$rid-$rid1; if($dff > 0) { if(($rid1%$rid1)==$this->simplered) { $red=$this->simplered; } } else { if(($rid1%$rid)==$this->simplered) { $red=$this->simplered; } } return $red; } } ?>
<?php namespace RedClient\Redpack; /********* 先在公共平臺(tái)配置授權(quán)的域名; 然后才能通過(guò), 網(wǎng)頁(yè)授權(quán)方式獲取微信用戶(hù)基本信息 網(wǎng)頁(yè)授權(quán)流程分為四步: 1.引導(dǎo)用戶(hù)進(jìn)入授權(quán)頁(yè)面同意授權(quán),獲取code 2.通過(guò)code換取網(wǎng)頁(yè)授權(quán)access_token(與基礎(chǔ)支持中的access_token不同) 3.如果需要,開(kāi)發(fā)者可以刷新網(wǎng)頁(yè)授權(quán)access_token,避免過(guò)期 4.通過(guò)網(wǎng)頁(yè)授權(quán)access_token和openid獲取用戶(hù)基本信息 **********/ class Oauth { protected $appid=''; protected $redirect_uri=''; protected $state='';//mt_rand(100,999); protected $appsecret=''; protected $data=array('flag'=>0,'msg'=>'','data'=>''); public function __construct() { $this->appid='appid';// $this->appsecret='secret';//; $this->state=mt_rand(100,999); } //引導(dǎo)用戶(hù)訪(fǎng)問(wèn)鏈接處理函數(shù) public function index($redirect_uri) { $this->redirect_uri=urlencode($redirect_uri);//微信自動(dòng)跳轉(zhuǎn)到$redirect_uri header('location:https://open.weixin.qq.com/connect/oauth3/authorize?appid='.$this->appid.'&redirect_uri='.$this->redirect_uri.'/oauth.php&response_type=code&scope=snsapi_userinfo&state='.$this->state.'&connect_redirect=1#wechat_redirect'); } public function getCode($code='',$state='',$token='',$webToken='') { $data=array( 'errorno'=>'', 'errormsg'=>'', 'data'=>'' ); if(empty($code)) { $this->data['flag']=0; $this->data['msg']='授權(quán)失??!'; } else { /* 1獲取webtoken 2獲取reflash_token 3獲取用戶(hù)信息 */ $token_url = 'https://api.weixin.qq.com/sns/oauth3/access_token?appid='.$this->appid.'&secret='.$this->appsecret.'&code='.$code.'&grant_type=authorization_code'; $token = json_decode(file_get_contents($token_url)); if (isset($token->errcode)) { $data['errorno']=$token->errcode; $data['errormsg']=$token->errmsg; } else { $access_token_url = 'https://api.weixin.qq.com/sns/oauth3/refresh_token?appid='.$this->appid.'&grant_type=refresh_token&refresh_token='.$token->refresh_token; //轉(zhuǎn)成對(duì)象 $accessToken = json_decode(file_get_contents($access_token_url)); if (isset($accessToken->errcode)) { $data['errorno']=$token->errcode; $data['errormsg']=$token->errmsg; } else { $user_info_url = 'https://api.weixin.qq.com/sns/userinfo?access_token='.$accessToken->access_token.'&openid='.$accessToken->openid.'&lang=zh_CN'; //轉(zhuǎn)成對(duì)象 $userInfo = json_decode(file_get_contents($user_info_url)); if (isset($userInfo->errcode)) { $data['errorno']=$token->errcode; $data['errormsg']=$token->errmsg; } else { $data['data']=$userInfo; } } } } return $data; } } ?>
<?php /****** 用于企業(yè)向微信用戶(hù)個(gè)人發(fā)現(xiàn)金紅包 目前支持向指定微信用戶(hù)的openid發(fā)放指定金額紅包。 (獲取openid參見(jiàn)微信公眾平臺(tái)開(kāi)發(fā)者文檔: 網(wǎng)頁(yè)授權(quán)獲取用戶(hù)基本信息) ****/ namespace RedClient\Redpack; class SendRedPack { private $config=array( 'nonce_str'=>'',//隨機(jī)字符串,不長(zhǎng)于32位 'sign'=>'',//簽名 'mch_billno'=>'',//商戶(hù)訂單號(hào) 'mch_id'=>'1111sdfsafsaddf',//微信支付分配的商戶(hù)號(hào) 'wxappid'=>'sddafdsadfdsafdsdd',//微信分配的公眾賬號(hào)ID 'send_name'=>'',//紅包發(fā)送者名稱(chēng) 're_openid'=>'',//接受紅包的用戶(hù),用戶(hù)在wxappid下的openid 'total_amount'=>'',//付款金額,單位分 'total_num'=>'',//紅包發(fā)放總?cè)藬?shù) 'wishing'=>'',//紅包祝福語(yǔ) 'client_ip'=>'',//調(diào)用接口的機(jī)器Ip地址 'act_name'=>'',//活動(dòng)名稱(chēng) 'remark'=>'',// 備注信息 ); protected $key=''; protected $url='https://api.mch.weixin.qq.com/mmpaymkttransfers/sendredpack'; protected $requestXml=''; //設(shè)置必要參數(shù) public function setFields($conf=array()) { foreach($conf as $k=>$v) { if(isset($this->config[$k]) && !empty($v)) { $this->config[$k]=$v; } } $this->config['mch_billno']=$this->billno(); $this->config['nonce_str']=$this->createNonceStr(); $this->createSign($conf); $this->createXml(); //echo $this->requestXml; } protected function billno() { return $this->config['mch_id'].time().md5(mt_rand(1000,9999)); } /* //檢查必要參數(shù)是否為空! public function checkConfig() { $flag=true; foreach($this->config as $k=>$v) { if(empty($v)) { $flag=false; break; } } } */ //隨機(jī)字符串,不長(zhǎng)于32位 public function createNonceStr( $len=32 ) { $strs = "abcdefghijklmnopqrstuvwxyz0123456789"; $str =""; $len=$len<=32?$len:32; for ( $i = 0; $i < $len; $i++ ) { $str.= substr($strs, mt_rand(0, strlen($strs)-1), 1); } return $str; } //格式化參數(shù) public function formatParam($config=array(),$flag=1) { $format=''; if(!empty($config)) { ksort($config); foreach($config as $k=>$v) { if($flag) { $v=urlencode($v); } if($flag==0 && strtolower($k)=='sign') { continue; } $format.=$k.'='.$v.'&'; } $format=trim($format,'&'); } return $format; } //創(chuàng)建SIGNATURE protected function createSign($config) { $format=$this->formatParam($config,0); $format.='&key='.$this->key; $signature=strtoupper(md5($format)); $this->config['sign']=$signature; return true;//$signature; } //創(chuàng)建xml格式數(shù)據(jù) protected function createXml() { $xml='<xml>'; foreach($this->config as $k=>$v) { if(!empty($v)) { $xml.='<'.$k.'><![CDATA['.$v.']]></'.$k.'>'; } } $xml.='</xml>'; $this->requestXml=$xml; } //XML格式數(shù)據(jù)轉(zhuǎn)換為數(shù)組 public function createArray($xml='') { $arr = json_decode(json_encode(simplexml_load_string($xml, 'SimpleXMLElement', LIBXML_NOCDATA)), true); return $arr; } //發(fā)送紅包 public function requestXml($timeout=30,$header=array()) { $ch = curl_init(); //超時(shí)時(shí)間 curl_setopt($ch,CURLOPT_TIMEOUT,$timeout); curl_setopt($ch,CURLOPT_RETURNTRANSFER, 1); curl_setopt($ch,CURLOPT_URL,$this->url); curl_setopt($ch,CURLOPT_SSL_VERIFYPEER,false); curl_setopt($ch,CURLOPT_SSL_VERIFYHOST,false); //默認(rèn)格式為PEM,可以注釋 curl_setopt($ch,CURLOPT_SSLCERTTYPE,'PEM'); curl_setopt($ch,CURLOPT_SSLCERT,dirname(__FILE__).'/apiclient_cert.pem');//pem證書(shū)地址 //默認(rèn)格式為PEM,可以注釋 curl_setopt($ch,CURLOPT_SSLKEYTYPE,'PEM'); curl_setopt($ch,CURLOPT_SSLKEY,dirname(__FILE__).'/apiclient_key.pem');//key證書(shū)地址 curl_setopt($ch,CURLOPT_CAINFO,'PEM'); curl_setopt($ch,CURLOPT_CAINFO,dirname(__FILE__).'/rootca.pem');//CA證書(shū)地址 //兩個(gè)文件合成一個(gè).pem文件 //curl_setopt($ch,CURLOPT_SSLCERT,getcwd().'/all.pem'); if( count($header) >= 1 ) { curl_setopt($ch, CURLOPT_HTTPHEADER, $header); } curl_setopt($ch,CURLOPT_POST, 1); curl_setopt($ch,CURLOPT_POSTFIELDS,$this->requestXml); $data = curl_exec($ch); var_dump($data); if($data) { curl_close($ch); var_dump($data); return $data; } else { $error = curl_errno($ch); echo 'ERROR:'.$error; curl_close($ch); return false; } } //返回非空值,非NULL public function notEmpty($val='') { $return=''; if(null !=$val && strlen($val) != 0) { $return=$val; } return $return?$return:false; } } ?>
<?php namespace RedClient\Redpack; class WeiXinInfo { private $AppID='appid'; private $AppSecret='secret'; private $grant_type='client_credential'; private $url='https://api.weixin.qq.com/cgi-bin/token'; public function __construct() { //$arr=array('access_token'=>'1','expires'=>'7200'); } //設(shè)置獲取ACCESSTOKEN 的URL public function setUrl() { return $this->url=$this->url.'?grant_type='.$this->grant_type.'&appid='.$this->AppID.'&secret='.$this->AppSecret; } //獲取APPID,SECRET public function getAppid() { $sql='select appid,secret from ly_appid where flag=1'; $model=M(); $result=$model->query($sql); if(!empty($result)) { $this->AppID=$result[0]['appid']; $this->AppSecret=$result[0]['secret']; return $result[0]; } } public function object2array($object) { if (is_object($object)) { foreach ($object as $key => $value) { $array[$key] = $value; } } else { $array = $object; } return $array; } //檢驗(yàn)URL有效 public function checkUrl() { $signature=isset($_GET['signature'])?strip_tags(trim($_GET['signature'])):''; $timestamp=isset($_GET['timestamp'])?strip_tags(trim($_GET['timestamp'])):''; $nonce=isset($_GET['nonce'])?strip_tags(trim($_GET['nonce'])):''; $echostr=isset($_GET['echostr'])?$_GET['echostr']:''; if(!empty($signature) && !empty($timestamp) && !empty($nonce)) { if($this->checkSign($signature,$timestamp,$nonce)) { echo $echostr; return true; } else { return false; } } } //驗(yàn)證SIGNATURE是否有效 private function checkSign($sign,$timestamp,$nonce) { $token=$this->getAccessToken(); //$token=$this->object2array($token); $sign_arr=array($token,$timstamp,$nonce); sort($sign_arr,SORT_STRING); $signStr=implode($sign_arr); $signStr=sha1($signStr); if(strtoupper($signStr)==strtoupper($sign)) { return true; } return false; } //通過(guò)微信接口獲取微信Access_Token public function getAccessToken() { $token=''; $this->setUrl(); $check=$this->checkToken(); if(session('?'.md5('getaccesstoken')) && $check) { $tokens=session(md5('getaccesstoken')); $token=$tokens->access_token; } else { $result=file_get_contents($this->url); $result=json_decode($result); $token=$result->access_token; $result->expires_in=$result->expires_in+time(); session(md5('getaccesstoken'),$result); } return $token; } //檢查微信ACCESS_TOKEN是否有效 public function checkToken() { if(session('?'.md5('getaccesstoken')) && session(md5('getaccesstoken'))) { $time=time(); $token=session(md5('getaccesstoken')); if($token->expires_in-$time > 30) { return true; } else { session(md5('getaccesstoken'),null); } } return false; } //保存微信ACCESSTOKEN到數(shù)據(jù)庫(kù) public function saveAccessToken() { $token=$this->getAccessToken(); $sql='select `id`,`rate`,token,ex_time,createtime from ly_token where token="'.$token.'" where appid="'.$this->AppID.'" AND secret="'.$this->AppSecret.'"'; $model=M(); $result=$model->query($sql); if(!empty($result)) { $time=time(); $expires=$time-$result[0]['createtime']; if($result[0]['ex_time']-$expires > 0) { return $result[0]['token']; } else { $token=$this->getAccessToken(); if(!empty($token)) { $token=json_decode($token); if(!isset($token['errcode']) or !$token['errcode']) { if(isset($token['access_token']) && $token['access_token']) { $data['access_token']=$token['access_token']; $data['createtime']=$time; $data['ex_time']=$token['expires_in']; $data['rate']=$result[0]['rate']+1; //$sql='update ly_token set token="'.$token['access_token'].'" ,createtime='.$time.',ex_time='.$token['expires_in'].' where `id`='.$result[0]['id']; $model=M('token'); $update=$model->where('`id`='.$result[0]['id'])->save($data); if($update) { return $token['access_token']; } } } else {//微信返回的錯(cuò)誤信息 $data['errcode']=$token['errcode']; $data['errmsg']=$token['errmsg']; $data['appid']=$this->AppID; $data['secret']=$this->AppSecret; $data['createtime']=time(); $data['rate']=$result[0]['rate']+1; $ein=$model->where('`id`='.$result[0]['id'])->save($data); if($ein) { return false; } } } } } else {//新插入數(shù)據(jù)庫(kù)保存 $token=$this->getAccessToken(); $model=M('token'); if(!empty($token)) { $data=array(); $token=json_decode($token); if(!isset($token['errcode']) or !$token['errcode']) { if(isset($token['access_token']) && $token['access_token']) { $data['access_token']=$token['access_token']; $data['createtime']=$time; $data['ex_time']=$token['expires_in']; //$sql='insert into ly_token() vlaues()'; $data['rate']=1; $in=$model->data($data)->add(); if($ein) { $token['access_token']; } } } else {//微信返回的錯(cuò)誤信息 $data['errcode']=$token['errcode']; $data['errmsg']=$token['errmsg']; $data['appid']=$this->AppID; $data['secret']=$this->AppSecret; $data['createtime']=time(); $data['rate']=1; $ein=$model->data($data)->add(); if($ein) { return false; } } } } return false; } } ?>
免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀(guān)點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。