微信搖一搖周邊 紅包


早上老大扔了個設備來說要做個搖一搖紅包  就上網找了下 強大的度娘都找不到大神們分享出來的源碼 只能自己埋頭去寫寫了

微信官方說明如下

搖一搖紅包說明

功能說明

搖一搖周邊紅包接口是為線下商戶提供的發紅包功能。用戶可以在商家門店等線下場所通過搖一搖周邊領取商家發放的紅包,在線上轉發分享無效。

開發者可通過接口開發搖一搖紅包功能,特點包括:

  1. 可選擇使用模板加載頁或自定義Html5頁面調起微信原生紅包頁面(詳見創建紅包活動中use_template字段,1為使用模板,2為使用自定義Html5頁面)
  2. 原生紅包頁面拆紅包,無需通過公眾號消息下發
  3. 提供關注公眾號能力,用戶可自行選擇是否關注(裂變紅包分享時無效)
  4. 完成頁面可配置跳轉鏈接,可跳轉商戶的其他自定義Html5頁面
  5. 同一個用戶在單個紅包活動中只能領取1次紅包


用戶側交互流程

流程圖1.jpg
流程圖2.jpg

紅包組件接口調用流程

  1. 申請紅包接口權限:登錄搖一搖周邊商戶后台https://zb.weixin.qq.com ,進入開發者支持,申請開通搖一搖紅包組件接口;
  2. 紅包預下單:調用微信支付的api進行紅包預下單,告知需要發放的紅包金額,人數,生成紅包ticket;
  3. 創建活動並錄入紅包信息:調用搖周邊平台的api錄入創建紅包活動並錄入信息,傳入預下單時生成的紅包ticket;
  4. 調用jsapi抽紅包:在搖出的頁面中通過調用jsapi抽紅包,抽中紅包的用戶可以拆紅包;
  5. 調用以上接口時,紅包提供商戶和紅包發放商戶公眾號要求一致。
 說明:
  紅包提供商戶:紅包預下單接口傳入的參數wxappid所代表的商戶
  紅包發放商戶:調用紅包接口創建紅包活動、錄入紅包信息、發放紅包的商戶公眾號

所以步驟應該是 ① 創建紅包活動 ② 預下單 ③ 錄入紅包
找出來了之前整理的類 在寫一下

1.創建活動

接口說明

 
        

創建紅包活動,設置紅包活動有效期,紅包活動開關等基本信息,返回活動id

 
        

接口調用說明

 
        
服務器端調用
http請求方式: POST
URL: https://api.weixin.qq.com/shakearound/lottery/addlotteryinfo?access_token=ACCESSTOKEN&use_template=1&logo_url=LOGO_URL
 
        

請求參數說明

 
        
參數 類型 說明
access_token string accesstoken,以參數的形式拼裝在url后
use_template int 是否使用模板,1:使用,2:不使用,以參數的形式拼裝在url后。(模版即交互流程圖中的紅包加載頁,使用模板用戶不需要點擊可自動打開紅包;不使用模版需自行開發HTML5頁面,並在頁面調用紅包jsapi)
logo_url string 使用模板頁面的logo_url,不使用模板時可不加。展示在搖一搖界面的消息圖標。圖片尺寸為120x120。
 
        

POST BODY:JSON格式的結構體

 
        
參數 類型 說明
title string 抽獎活動名稱(選擇使用模板時,也作為搖一搖消息主標題),最長6個漢字,12個英文字母。
desc string 抽獎活動描述(選擇使用模板時,也作為搖一搖消息副標題),最長7個漢字,14個英文字母。
onoff int 抽獎開關。0關閉,1開啟,默認為1
begin_time long 抽獎活動開始時間,unix時間戳,單位秒
expire_time long 抽獎活動結束時間,unix時間戳,單位秒,紅包活動有效期最長為91天
sponsor_appid string 紅包提供商戶公眾號的appid,需與預下單中的公眾賬號appid(wxappid)一致
total long 紅包總數,紅包總數是錄入紅包ticket總數的上限,因此紅包總數應該大於等於預下單時紅包ticket總數。
jump_url string 紅包關注界面后可以跳轉到第三方自定義的頁面
key string 開發者自定義的key,用來生成活動抽獎接口的簽名參數,長度32位。使用方式見sign生成規則
 
        

請求示例

 
        
Content-Type: application/json Post Body:
{                                                            
 "title": "title",                           
 "desc": "desc",                             
 "onoff": 1,                                 
 "begin_time": 1428854400,                            
 "expire_time": 1428940800,                           
 "sponsor_appid": "wxxxxxxxxxxxxxx",
 "total": 10,
 "jump_url": JUMP_URL,     
 "key": "keyyyyyyyyyyyyyyyyyyyyyyyyyyyyyy"                            
}
 
 
        

返回數據說明

 
        
參數 類型 說明
errcode int 錯誤碼。0為成功,其他為失敗。詳細請參考錯誤碼表
errmsg string 錯誤信息
lottery_id string 生成的紅包活動id
page_id int 生成的模板頁面ID
 
        

示例

 
        
{     
 "errcode":0,     
 "errmsg":"",     
 "lottery_id":"xxxxxxllllll", 
 "page_id":1, 
}
 
/**
 * 搖一搖紅包 創建活動
 * @author jiosen
 */
class addlotteryinfo_pub extends Wxpay_client_pub
{
	var $code;//code碼,用以獲取openid
	var $openid;//用戶的openid

	function __construct($access_token,$logo)
	{
		//設置接口鏈接
		$this->url = "https://api.weixin.qq.com/shakearound/lottery/addlotteryinfo?access_token=".$access_token."&use_template=1&logo_url=".$logo;
		//設置curl超時時間
		$this->curl_timeout = WxPayConf_pub::CURL_TIMEOUT;
	}

	/**
	 * 生成接口參數  json
	 */
	function createJson()
	{
		try
		{
			//檢測必填參數
			if($this->parameters["title"] == null)
			{
				throw new SDKRuntimeException("缺少抽獎活動名稱title!"."<br>");
			}elseif ($this->parameters["desc"] == null ) {
				throw new SDKRuntimeException("缺少抽獎活動描述desc!"."<br>");
			}elseif ($this->parameters["begin_time"] == null) {
				throw new SDKRuntimeException("缺少活動開始時間 begin_time!"."<br>");
			}elseif ($this->parameters["expire_time"] == null) {
				throw new SDKRuntimeException("缺少活動結束時間 expire_time!"."<br>");
			}elseif ($this->parameters["total"] == null) {
				throw new SDKRuntimeException("缺少紅包總數total!"."<br>");
			}elseif ($this->parameters["jump_url"] == null) {
				throw new SDKRuntimeException("缺少紅包關注跳轉連接jump_url!"."<br>");
			}elseif ($this->parameters["key"] == null) {
				throw new SDKRuntimeException("缺少紅包key!"."<br>");
			}
			$this->parameters["title"] = urlencode($this->parameters["title"]);
			$this->parameters["desc"] = urlencode($this->parameters["desc"]);
			$this->parameters["onoff"] = '1';//開啟活動
			$this->parameters["sponsor_appid"] = WxPayConf_pub::APPID;//公眾賬號ID
			//var_dump($this->parameters);
			//echo json_encode($this->parameters);
			return  json_encode($this->parameters);
		}catch (SDKRuntimeException $e)
		{
			die($e->errorMessage());
		}
	}


	function hbpreorder()
	{
		$data = $this->createJson();
		$result = $this->curl_post($this->url,urldecode($data));
		$result = json_decode($result);
		return $result;
	}

	function curl_post($url,$data)
    {
        $curl = curl_init($url);
        curl_setopt($curl, CURLOPT_CONNECTTIMEOUT, 30);
        curl_setopt($curl, CURLOPT_TIMEOUT, 10);
        curl_setopt($curl, CURLOPT_RETURNTRANSFER, TRUE);
        curl_setopt($curl, CURLOPT_SSL_VERIFYPEER, false);
        curl_setopt($curl, CURLOPT_POST, 1);//發送一個常規的Post請求
    	curl_setopt($curl, CURLOPT_POSTFIELDS, $data);//Post提交的數據包
        $rv = curl_exec($curl);//輸出內容
        curl_close($curl);
        return $rv;
    }

	/**
	 * 	作用:生成可以獲得code的url
	 */
	function createOauthUrlForCode($redirectUrl)
	{
		$urlObj["appid"] = WxPayConf_pub::APPID;
		$urlObj["redirect_uri"] = "$redirectUrl";
		$urlObj["response_type"] = "code";
		$urlObj["scope"] = "snsapi_base";
		$urlObj["state"] = "STATE"."#wechat_redirect";
		$bizString = $this->formatBizQueryParaMap($urlObj, false);
		return "https://open.weixin.qq.com/connect/oauth2/authorize?".$bizString;
	}



	/**
	 * 	作用:生成可以獲得openid的url
	 */
	function createOauthUrlForOpenid()
	{
		$urlObj["appid"] = WxPayConf_pub::APPID;
		$urlObj["secret"] = WxPayConf_pub::APPSECRET;
		$urlObj["code"] = $this->code;
		$urlObj["grant_type"] = "authorization_code";
		$bizString = $this->formatBizQueryParaMap($urlObj, false);
		return "https://api.weixin.qq.com/sns/oauth2/access_token?".$bizString;
	}

	/**
	 * 	作用:通過curl向微信提交code,以獲取openid
	 */
	function getOpenid()
	{
		$url = $this->createOauthUrlForOpenid();
		//初始化curl
		$ch = curl_init();
		//設置超時
		curl_setopt($ch, CURLOP_TIMEOUT, $this->curl_timeout);
		curl_setopt($ch, CURLOPT_URL, $url);
		curl_setopt($ch,CURLOPT_SSL_VERIFYPEER,FALSE);
		curl_setopt($ch,CURLOPT_SSL_VERIFYHOST,FALSE);
		curl_setopt($ch, CURLOPT_HEADER, FALSE);
		curl_setopt($ch, CURLOPT_RETURNTRANSFER, TRUE);
		//運行curl,結果以jason形式返回
		$res = curl_exec($ch);
		curl_close($ch);
		$data = json_decode($res,true);
		$this->openid = $data['openid'];
		return $this->openid;
	}

	/**
	 * 	作用:設置code
	 */
	function setCode($code_)
	{
		$this->code = $code_;
	}

}

 要注意提交的數據是json 不是xml

 前端頁面隨便做一下

php 代碼

                     $title = $_POST['title'];
		     $file = $_FILES['img'];
		     $tools = new Tools(); //這是一個文件上傳類 隨意選擇一樣你喜歡的上傳方式
		     $logo_url = $tools->_upload_award("poll_img", $file, time()); 
		     $description = $_POST['description'];
		     $total = $_POST['total'];
		     $jump_url = $_POST['jump_url'];
		     $token = getAccessToken();   //這里是我封裝的一個獲取 token的 方法  做了時間限制 防止超出調用次數

	           $Redpack = new addlotteryinfo_pub($token,SITE_URL.$logo_url);
	           $time = time();
	           $end = time()+60*24*60*60;//兩個月  這里的開始和結束時間我固定了 
	          $key = $Redpack->createNoncestr(); //key
	         $Redpack->setParameter('title', $title);
	        //活動標題
	        $Redpack->setParameter('desc', $description);
	        //活動描述
	        $Redpack->setParameter('begin_time', $time);
	        //開始時間
	        $Redpack->setParameter('expire_time', $end); 
	        //結束時間
	        $Redpack->setParameter('total', $total);
	        //紅包總數
	        $Redpack->setParameter('jump_url', $jump_url);
	        //key
	        $Redpack->setParameter('key', $key);
	        $result = $Redpack->hbpreorder();
	        $result = (array)$result; 
	        if($result['errcode']==0){
	          	$lottery_id = $result['lottery_id'];
	        	$page_id = $result['page_id'];
	        	//這里記得存一下數據庫;
            
	        }else{
	        	//echo '創建活動失敗:'.$result['errmsg'];
	        	//這里是錯誤提示
	        }          

 

2.預下單

接口說明

設置單個紅包的金額,類型等,生成紅包信息。預下單完成后,需要在72小時內調用jsapi完成抽紅包的操作。(紅包過期失效后,資金會退回到商戶財付通帳號。)

接口調用說明

服務器端調用
http請求方式: POST
https://api.mch.weixin.qq.com/mmpaymkttransfers/hbpreorder
POST數據格式:XML
需要商戶證書

請求參數說明

參數 字段 是否必須 示例值 類型 說明
隨機字符串 nonce_str 5K8264ILTKCH16CQ2502SI8Z

NMTM67VS

String(32) 隨機字符串,不長於32位
簽名 sign C380BEC2BFD727A4B68451335

19F3AD6

String(32) 生成簽名方式查看簽名算法
商戶訂單號 mch_billno 10000098201411111234567890 String(28) 商戶訂單號(每個訂單號必須唯一)組成: mch_id+yyyymmdd+10位一天內不能重復的數字。接口根據商戶訂單號支持重入, 如出現超時可再調用。
商戶號 mch_id 10000098 String(32) 紅包提供者的商戶號(微信支付分配的商戶號)
公眾賬號appid wxappid wx8888888888888888 String(32) 紅包提供者公眾號的appid,對應頭像展示在紅包頁面
商戶名稱 send_name 天虹百貨 String(32) 紅包提供者名稱,展示在紅包頁面
紅包類型 hb_type NORMAL String(16) NORMAL-普通紅包;GROUP-裂變紅包(可分享紅包給好友,無關注公眾號能力)。
總金額 total_amount 1000 int 總付款金額,單位分
紅包發放總人數 total_num 1 int 紅包發放總人數,即總共有多少人可以領到該組紅包(包括分享者)。普通紅包填1,裂變紅包必須大於1。
紅包金額設置方式 amt_type ALL_RAND String(32) 紅包金額設置方式,只對裂變紅包生效。ALL_RAND—全部隨機
紅包祝福語 wishing 感謝您參加猜燈謎活動,祝您元宵節快樂 String(16) 紅包祝福語,展示在紅包頁面
活動名稱 act_name 猜燈謎搶紅包活動 String(32) 活動名稱,在不支持原生紅包的微信版本中展示在紅包消息
備注 remark 猜越多得越多,快來搶! String(32) 備注信息,在不支持原生紅包的微信版本中展示在紅包消息
授權商戶號 auth_mchid 1000052601 String(32) 用於發紅包時微信支付識別搖周邊紅包,所有開發者統一填寫搖周邊平台的商戶號:1000052601
授權商戶APPID auth_appid wxbf42bd79c4391863 String(32) 用於發紅包時微信支付識別搖周邊紅包,所有開發者統一填寫搖周邊平台的appid:wxbf42bd79c4391863
風控設置 risk_cntl NORMAL String(32) 用於管控接口風險。具體值如下:NORMAL—正常情況;IGN_FREQ_LMT—忽略防刷限制,強制發放;IGN_DAY_LMT—忽略單用戶日限額 限制,強制發放;IGN_FREQ_DAY_LMT—忽略防刷和單用戶日限額限制,強制發放;如無特殊要求,請設為NORMAL。若忽略某項風險控制,可 能造成資金損失,請謹慎使用。

請求示例

<xml>     
<sign><![CDATA[E1EE61A91C8E90F299DE6AE075D60A2D]]></sign>     
<mch_billno><![CDATA[0010010404201411170000046545]]></mch_billno>     
<mch_id><![CDATA[10000097]]></mch_id>     
<wxappid><![CDATA[wxcbda96de0b165486]]></wxappid>     
<send_name><![CDATA[send_name]]></send_name>     
<hb_type><![CDATA[NORMAL]]></hb_type>     
<auth_mchid><![CDATA[10000098]]></auth_mchid>     
<auth_appid><![CDATA[wx7777777]]></auth_appid>     
<total_amount><![CDATA[200]]></total_amount>     
<amt_type><![CDATA[ALL_RAND]]></amt_type>     
<total_num><![CDATA[3]]></total_num>     
<wishing><![CDATA[恭喜發財 ]]></wishing>     
<act_name><![CDATA[ 新年紅包 ]]></act_name>     
<remark><![CDATA[新年紅包 ]]></remark>     
<risk_cntl><![CDATA[NORMAL]]></risk_cntl>     
<nonce_str><![CDATA[50780e0cca98c8c8e814883e5caa672e]]></nonce_str>
</xml>
 

返回數據說明

返回格式為xml

參數 字段 是否必須 示例值 類型 說明
返回狀態碼 return_code SUCCESS String(16) SUCCESS/FAIL;此字段是通信標識,非交易標識,交易是否成功需要查看result_code來判斷
返回信息 return_msg 簽名失敗 String(128) 返回信息,如非空,為錯誤原因 簽名失敗 參數格式校驗錯誤

以下字段在return_code為SUCCESS的時候有返回

參數 字段 是否必須 示例值 類型 說明
簽名 sign C380BEC2BFD727A4B6845133519F3AD6 String(32) 生成簽名方式查看 簽名算法
業務結果 result_code SUCCESS String(16) SUCCESS/FAIL
錯誤代碼 err_code SUCCESS String(32) 錯誤碼信息
錯誤代碼描述 err_code_des 系統錯誤 String(128) 結果信息描述

以下字段在return_code 和result_code都為SUCCESS的時候有返回

參數 字段 是否必須 示例值 類型 說明
商戶訂單號 mch_billno 10000098201411111234567890 String(28) 商戶訂單號(每個訂單號必須唯一)組成: mch_id+yyyymmdd+10位一天內不能重復的數字。
商戶號 mch_id 10000098 String(32) 微信支付分配的商戶號
公眾賬號appid wxappid wx8888888888888888 String(32) 商戶appid
總金額 total_amount 1000 int 總付款金額,單位分
ticket sp_ticket 2J6MtR+SlbZ8Ga4EDi64X5

vC4Xv01ofX4uWOqqTc9kGJYhkq5 st5ucrXKxkjnC/UuvLeuhdIfiYg i4hJuJ95qjt9mwxqSBEmjGbZlL+ sqM9upoWsEjup28KPvaVrdao/Hg 6WqyqUL5E2zPHfM1sb1w==

String sp_ticket,一個普通紅包對應一個ticket
紅包訂單號 detail_id 0000000666201504290000042120   紅包內部訂單號
發送時間   20150429203444   紅包發放時間

成功示例

<xml> 	
<return_code><![CDATA[SUCCESS]]></return_code> 	
<return_msg><![CDATA[發放成功.]]></return_msg> 
<result_code><![CDATA[SUCCESS]]></result_code> 
<err_code><![CDATA[0]]></err_code> 	
<err_code_des><![CDATA[發放成功.]]></err_code_des> 	
<mch_billno><![CDATA[0010010404201411170000046545]]></mch_billno> 
<mch_id>10010404</mch_id> 	
<wxappid><![CDATA[wx6fa7e3bab7e15415]]></wxappid> 	
<sp_ticket><![CDATA[0cca98c8c8e814883]]></sp_ticket> 
<total_amount>3</total_amount> 	
<detail_id><![CDATA[001001040420141117000004888]]></detail_id> 
<send_time><![CDATA[20150101080000]]></send_time> 
</xml>  

失敗示例

<xml>     
<return_code><![CDATA[FAIL]]></return_code> 	
<return_msg><![CDATA[系統繁忙,請稍后再試.]]></return_msg> 	
<result_code><![CDATA[FAIL]]></result_code> 	
<err_code><![CDATA[268458547]]></err_code> 	
<err_code_des><![CDATA[系統繁忙,請稍后再試.]]></err_code_des> 	
<mch_billno><![CDATA[0010010404201411170000046542]]></mch_billno> 	        
<mch_id>10010404</mch_id> 	
<wxappid><![CDATA[wx6fa7e3bab7e15415]]></wxappid> 	 
<total_amount>3</total_amount> 
</xml>
/**
 * 搖一搖紅包預下單 
 * @author jiosen
 */
class Yhb_pub extends Wxpay_client_pub
{
	var $code;//code碼,用以獲取openid
	var $openid;//用戶的openid

	function __construct()
	{
		//設置接口鏈接
		$this->url = "https://api.mch.weixin.qq.com/mmpaymkttransfers/hbpreorder";
		//設置curl超時時間
		$this->curl_timeout = WxPayConf_pub::CURL_TIMEOUT;
	}

	/**
	 * 生成接口參數xml
	 */
	function createXml()
	{
		try
		{
			//檢測必填參數
			if($this->parameters["mch_billno"] == null)
			{
				throw new SDKRuntimeException("缺少發紅包接口必填參數mch_billno!"."<br>");
			}elseif ($this->parameters["send_name"] == null ) {
				throw new SDKRuntimeException("缺少發紅包接口必填參數send_name!"."<br>");
			}elseif ($this->parameters["total_amount"] == null) {
				throw new SDKRuntimeException("缺少發紅包接口必填參數total_amount!"."<br>");
			}elseif ($this->parameters["total_num"] == null) {
				throw new SDKRuntimeException("缺少發紅包接口必填參數total_num!"."<br>");
			}elseif ($this->parameters["wishing"] == null) {
				throw new SDKRuntimeException("缺少發紅包接口必填參數wishing!"."<br>");
			}elseif ($this->parameters["act_name"] == null) {
				throw new SDKRuntimeException("缺少發紅包接口必填參數act_name!"."<br>");
			}elseif ($this->parameters["remark"] == null) {
				throw new SDKRuntimeException("缺少發紅包接口必填參數remark!"."<br>");
			}
			$this->parameters["wxappid"] = WxPayConf_pub::APPID;//公眾賬號ID
			$this->parameters["mch_id"] = WxPayConf_pub::MCHID;//商戶號
			$this->parameters["nonce_str"] = $this->createNoncestr();//隨機字符串
			//$this->parameters["re_openid"] = $this->openid;//用戶openid
			$this->parameters["hb_type"] = 'NORMAL';//紅包類型 NORMAL-普通紅包;GROUP-裂變紅包(可分享紅包給好友,無關注公眾號能力)。 
			$this->parameters["auth_mchid"] = '1000052601';//搖周邊商戶號
			$this->parameters["auth_appid"] = 'wxbf42bd79c4391863';//搖周邊 appid
			$this->parameters["risk_cntl"] = 'NORMAL';//風控設置
			$this->parameters["sign"] = $this->getSign($this->parameters);//簽名
			return  $this->arrayToXml($this->parameters);
		}catch (SDKRuntimeException $e)
		{
			die($e->errorMessage());
		}
	}


	function hbpreorder()
	{
		$this->postXmlSSL();
		$this->result = $this->xmlToArray($this->response);
		return $this->result;
	}



	/**
	 * 	作用:生成可以獲得code的url
	 */
	function createOauthUrlForCode($redirectUrl)
	{
		$urlObj["appid"] = WxPayConf_pub::APPID;
		$urlObj["redirect_uri"] = "$redirectUrl";
		$urlObj["response_type"] = "code";
		$urlObj["scope"] = "snsapi_base";
		$urlObj["state"] = "STATE"."#wechat_redirect";
		$bizString = $this->formatBizQueryParaMap($urlObj, false);
		return "https://open.weixin.qq.com/connect/oauth2/authorize?".$bizString;
	}



	/**
	 * 	作用:生成可以獲得openid的url
	 */
	function createOauthUrlForOpenid()
	{
		$urlObj["appid"] = WxPayConf_pub::APPID;
		$urlObj["secret"] = WxPayConf_pub::APPSECRET;
		$urlObj["code"] = $this->code;
		$urlObj["grant_type"] = "authorization_code";
		$bizString = $this->formatBizQueryParaMap($urlObj, false);
		return "https://api.weixin.qq.com/sns/oauth2/access_token?".$bizString;
	}

	/**
	 * 	作用:通過curl向微信提交code,以獲取openid
	 */
	function getOpenid()
	{
		$url = $this->createOauthUrlForOpenid();
		//初始化curl
		$ch = curl_init();
		//設置超時
		curl_setopt($ch, CURLOP_TIMEOUT, $this->curl_timeout);
		curl_setopt($ch, CURLOPT_URL, $url);
		curl_setopt($ch,CURLOPT_SSL_VERIFYPEER,FALSE);
		curl_setopt($ch,CURLOPT_SSL_VERIFYHOST,FALSE);
		curl_setopt($ch, CURLOPT_HEADER, FALSE);
		curl_setopt($ch, CURLOPT_RETURNTRANSFER, TRUE);
		//運行curl,結果以jason形式返回
		$res = curl_exec($ch);
		curl_close($ch);
		//取出openid
		$data = json_decode($res,true);
		$this->openid = $data['openid'];
		return $this->openid;
	}

	/**
	 * 	作用:設置code
	 */
	function setCode($code_)
	{
		$this->code = $code_;
	}

}

 這里需要注意的是  auth_mchid 和 auth_appid 要填搖周邊平台給出的appid 和商戶號



調用 (這里不貼前端頁面了)
       $Redpack = new \Yhb_pub(); 
        $Redpack->setParameter('mch_billno', WxPayConf_pub::MCHID.date('YmdHis').rand(1000, 9999));
        //商戶名稱
        $Redpack->setParameter('send_name', "商戶名稱");
        //付款金額
        $Redpack->setParameter('total_amount', 100); //單位分
        //紅包發放總人數
        $Redpack->setParameter('amt_type', "ALL_RAND");
        $Redpack->setParameter('total_num', 1);
        //紅包祝福語
        $Redpack->setParameter('wishing', "搖一搖送紅包");
        //活動名稱
        $Redpack->setParameter('act_name', "搖一搖送紅包");
        //備注
        $Redpack->setParameter('remark', "搖一搖送紅包 備注");
        $result = $Redpack->hbpreorder();
        if($result[''])

 



3.錄入紅包

接口說明

在調用"創建紅包活動"接口之后,調用此接口錄入紅包信息。注意,此接口每次調用,都會向某個活動新增一批紅包信息,如果紅包數少於100 個,請通過一次調用添加所有紅包信息。如果紅包數大於100,可以多次調用接口添加。請注意確保多次錄入的紅包ticket總的數目不大於創建該紅包活動 時設置的total值。

接口調用說明

服務器端調用
http請求方式: POST
URL:https://api.weixin.qq.com/shakearound/lottery/setprizebucket?access_token=ACCESSTOKEN

請求參數說明

參數 類型 說明
access_token string accesstoken,以參數的形式拼裝在url后

POST BODY:JSON格式的結構體

參數 類型 說明
lottery_id string 紅包抽獎id,來自addlotteryinfo返回的lottery_id
mchid string 紅包提供者的商戶號,,需與預下單中的商戶號mch_id一致
sponsor_appid string 紅包提供商戶公眾號的appid,需與預下單中的公眾賬號appid(wxappid)一致
prize_info_list json數組 紅包ticket列表,如果紅包數較多,可以一次傳入多個紅包,批量調用該接口設置紅包信息。每次請求傳入的紅包個數上限為100
ticket string 預下單時返回的紅包ticket,單個活動紅包ticket數量上限為100000個,可添加多次。

請求示例

Content-Type: application/json Post Body:
{     
"lottery_id": "xxxxxxllllll",     
"mchid": "10000098",     
"sponsor_appid": "wx8888888888888888",   
"prize_info_list": [         
     {            
   "ticket": "v1|ZiPs2l0hpMBp3uwGI1rwp45vOdz/V/zQ/00jP9MeWT+e47/q1FJjwCIP34frSjzOxAEzJ7k2CtAg1pmcShvkChBWqbThxPm6MBuzceoHtj79iHuHaEn0WAO+j4sXnXnbGswFOlDYWg1ngvrRYnCY3g=="
     },
     {
   "ticket": "v1|fOhNUTap1oepSm5ap0hx1gmATM\/QX\/xn3sZWL7K+5Z10sbV5\/mZ4SwxwxbK2SPV32eLRvjd4ww1G3H5a+ypqRrySi+4oo97y63KoEQbRCPjbkyQBY8AYVyvD40V2b9slTQCm2igGY98mPe+VxZiayQ=="
     }
   ]
}

返回數據說明

參數 類型 說明
errcode int 錯誤碼。0為成功,其他為失敗。詳細請參考錯誤碼表
errmsg string 錯誤信息
repeat_ticket_list array 重復使用的ticket列表,如為空,將不返回
expire_ticket_list array 過期的ticket列表,如為空,將不返回
invalid_amount_ticket_list array 金額不在大於1元,小於1000元的ticket列表,如為空,將不返回
success_num int 成功錄入的紅包數量
wrong_authmchid_ticket_list array 原因:生成紅包的時候,授權商戶號auth_mchid和auth_appid沒有寫搖周邊的商戶號
invalid_ticket_list array ticket解析失敗,可能有錯別字符或不完整

示例

{	     
"errcode":0,     
"errmsg":"",     
"repeat_ticket_list":[         
     {            
"ticket": "v1|ZiPs2l0hpMBp3uwGI1rwp45vOdz/V/zQ/00jP9MeWT+e47/q1FJjwCIP34frSjzOxAEzJ7k2CtAg1pmcShvkChBWqbThxPm6MBuzceoHtj79iHuHaEn0WAO+j4sXnXnbGswFOlDYWg1ngvrRYnCY3g=="                       
     },
     {
"ticket":"v1|ZiPs2l0zzXCsdfwe45dxCdHiukOdz/V/zQ/89xcnC5XnT+e47/q1FJjwCO4frSjzOxAEzJ7k2CtAg1pmcShvkChBWzc45dDGC32Dcxx4DGxczjDCGsdjowe9iHuaEn0WAO+GswFOlDYWg1ngvrRYnCY3g=="         	}    		
     } 
  ], 	
"success_num":100 
}
/**
 * 搖一搖紅包 錄入紅包
 * @author jiosen
 */
class lottery_pub extends Wxpay_client_pub
{
	var $code;//code碼,用以獲取openid
	var $openid;//用戶的openid

	function __construct($access_token)
	{
		//設置接口鏈接
		$this->url = "https://api.weixin.qq.com/shakearound/lottery/setprizebucket?access_token=".$access_token;
		//設置curl超時時間
		$this->curl_timeout = WxPayConf_pub::CURL_TIMEOUT;
	}

	/**
	 * 生成接口參數  json
	 */
	function createJson()
	{
		try
		{
			//檢測必填參數
			if($this->parameters["lottery_id"] == null)
			{
				throw new SDKRuntimeException("缺少抽獎活動id lottery_id !"."<br>");
			}else if(empty($this->parameters["prize_info_list"])){
				throw new SDKRuntimeException("缺少抽獎活動紅包 prize_info_list !"."<br>");
			}

			$this->parameters["mchid"] = WxPayConf_pub::MCHID;//授權商戶號
			$this->parameters["sponsor_appid"] = WxPayConf_pub::APPID;//授權上號appid
			return  json_encode($this->parameters);
			//echo json_encode($this->parameters);die;
		}catch (SDKRuntimeException $e)
		{
			die($e->errorMessage());
		}
	}

	function setJsonArray($parameter, $parameterValue){
		$this->parameters[$this->trimString($parameter)] = $parameterValue;
	}
	function hbpreorder()
	{
		$data = $this->createJson();
		$result = $this->curl_post($this->url,$data);
		$result = json_decode($result);
		return $result;
	}

	function curl_post($url,$data)
    {
        $curl = curl_init($url);
        curl_setopt($curl, CURLOPT_CONNECTTIMEOUT, 30);
        curl_setopt($curl, CURLOPT_TIMEOUT, 10);
        curl_setopt($curl, CURLOPT_RETURNTRANSFER, TRUE);
        curl_setopt($curl, CURLOPT_SSL_VERIFYPEER, false);
        curl_setopt($curl, CURLOPT_POST, 1);//發送一個常規的Post請求
    	curl_setopt($curl, CURLOPT_POSTFIELDS, $data);//Post提交的數據包
        $rv = curl_exec($curl);//輸出內容
        curl_close($curl);
        return $rv;
    }

	/**
	 * 	作用:生成可以獲得code的url
	 */
	function createOauthUrlForCode($redirectUrl)
	{
		$urlObj["appid"] = WxPayConf_pub::APPID;
		$urlObj["redirect_uri"] = "$redirectUrl";
		$urlObj["response_type"] = "code";
		$urlObj["scope"] = "snsapi_base";
		$urlObj["state"] = "STATE"."#wechat_redirect";
		$bizString = $this->formatBizQueryParaMap($urlObj, false);
		return "https://open.weixin.qq.com/connect/oauth2/authorize?".$bizString;
	}



	/**
	 * 	作用:生成可以獲得openid的url
	 */
	function createOauthUrlForOpenid()
	{
		$urlObj["appid"] = WxPayConf_pub::APPID;
		$urlObj["secret"] = WxPayConf_pub::APPSECRET;
		$urlObj["code"] = $this->code;
		$urlObj["grant_type"] = "authorization_code";
		$bizString = $this->formatBizQueryParaMap($urlObj, false);
		return "https://api.weixin.qq.com/sns/oauth2/access_token?".$bizString;
	}

	/**
	 * 	作用:通過curl向微信提交code,以獲取openid
	 */
	function getOpenid()
	{
		$url = $this->createOauthUrlForOpenid();
		//初始化curl
		$ch = curl_init();
		//設置超時
		curl_setopt($ch, CURLOP_TIMEOUT, $this->curl_timeout);
		curl_setopt($ch, CURLOPT_URL, $url);
		curl_setopt($ch,CURLOPT_SSL_VERIFYPEER,FALSE);
		curl_setopt($ch,CURLOPT_SSL_VERIFYHOST,FALSE);
		curl_setopt($ch, CURLOPT_HEADER, FALSE);
		curl_setopt($ch, CURLOPT_RETURNTRANSFER, TRUE);
		//運行curl,結果以jason形式返回
		$res = curl_exec($ch);
		curl_close($ch);
		//取出openid
		$data = json_decode($res,true);
		$this->openid = $data['openid'];
		return $this->openid;
	}

	/**
	 * 	作用:設置code
	 */
	function setCode($code_)
	{
		$this->code = $code_;
	}

}

 

調用
     
    $token = getAccessToken();
    $Redpack = new \lottery_pub($token);
    $lottery_id = ''; //這里讀取數據庫取出創建活動時返回的 lottery_id $Redpack->setParameter('lottery_id', $lottery_id); //活動id $prize_info_list =array(array('ticket'=>'這里取出預下單返回的sp_ticket')); $Redpack->setJsonArray('prize_info_list', $prize_info_list); //提交 $Redpack->hbpreorder();

 

搶紅包頁面  php

 

 function getshakeinfo($access_token,$ticket){
        $getshakeinfourl='https://api.weixin.qq.com/shakearound/user/getshakeinfo?access_token='.$access_token;
          $jo=0;
          if($access_token){
            $data=array('ticket' =>$ticket);
            $rd=$this->curl_post($getshakeinfourl,json_encode($data));
            $jo=json_decode($rd);
          }else{
            echo 'access_token null';
          }
          return $jo;
    }

     $ticket=$_GET['ticket'];//獲叏設備信息,包括 U UID 、 major 、 minor ,以及距離、 openID 等信息
     $token = getAccessToken();
        $shake=getshakeinfo($token,$ticket);
        $openid=$shake->data->openid;
        $jsapi = new Common_util_pub(); 
        $noncestr = $jsapi->createNoncestr();
        $parameters = array(
                'lottery_id' =>'創建活動時候返回的活動ID',
                'noncestr'=>$noncestr,
                'openid'=>$openid,
            );
        $signStr = $jsapi->formatBizQueryParaMap($parameters,false);
        $key = '創建活動時候的key';
        $signStr=$signStr."&key=".$key;
        $sign = strtoupper(md5($signStr));
        

 上一步返回的參數填在搶紅包html頁面

<script type="text/javascript" src="http://zb.weixin.qq.com/app/shakehb/BeaconShakehbJsBridge.js">
</script>
<script type="text/javascript">
	BeaconShakehbJsBridge.ready(function(){
		//alert();
		BeaconShakehbJsBridge.invoke('jumpHongbao',{lottery_id:"{$lottery_id}",noncestr:"{$noncestr}",openid:"{$openid}",sign:"{$sign}"}); 
		});
</script>

 

紅包綁定用戶事件通知     

接口說明

用戶進入紅包頁面時,后台會將一個紅包ticket和用戶openid綁定,微信會把這個事件推送到開發者填寫的URL(登錄公眾平台進入開發者中心設置)。推送內容包含用戶openid,紅包活動id,紅包ticket、金額以及紅包綁定時間。

注:紅包綁定用戶不等同於用戶領取紅包。用戶進入紅包頁面后,有可能不拆紅包,但該紅包ticket已被綁定,不能再被其他用戶綁定,過期后會退回商戶財付通賬戶。

推送XML數據包示例

<xml> 	
<ToUserName><![CDATA[toUser]]></ToUserName> 	
<FromUserName><![CDATA[fromUser]]></FromUserName> 
<CreateTime>1442824314</CreateTime> 
<MsgType><![CDATA[event]]></MsgType> 	
<Event><![CDATA[ShakearoundLotteryBind]]></Event> 	
<LotteryId><![CDATA[lotteryid]]></LotteryId> 	
<Ticket><![CDATA[ticket]]></Ticket> 	
<Money>88</Money> 	
<BindTime>1442824313</BindTime> 
</xml>  
添加事件處理即可
/**
	 * 事件處理
	 * @param unknown $object
	 * @return string
	 */
	public function handleEvent($object) {
		
		// Event是事件類型(subscribe,LOCATION)
		$oneEvent = $object->Event;
		// EventKey是菜單事件的key值
		$key = $object->EventKey;
		// 關注事件
		if ($oneEvent == "subscribe" || $oneEvent == "SCAN") {
			if(!empty($object->Ticket)) {
				//掃碼事件
				....
			} else {
				//關注事件
				....
			}
		}else if($oneEvent=="ShakearoundLotteryBind"){
			//添加到數據庫
		}else if.......其他的事件......
	}

 完畢了.時間比較匆忙 也沒時間做優化 大神經過順便指導12  我好搓的英文基礎

下面貼上完整WxPayPubHelper 集成了所有支付類 配置可用

<?php
/**
 * 微信支付幫助庫
 * ====================================================
 * 接口分三種類型:
 * 【請求型接口】--Wxpay_client_
 * 		統一支付接口類--UnifiedOrder
 * 		訂單查詢接口--OrderQuery
 * 		退款申請接口--Refund
 * 		退款查詢接口--RefundQuery
 * 		對賬單接口--DownloadBill
 * 		短鏈接轉換接口--ShortUrl
 * 【響應型接口】--Wxpay_server_
 * 		通用通知接口--Notify
 * 		Native支付——請求商家獲取商品信息接口--NativeCall
 * 【其他】
 * 		靜態鏈接二維碼--NativeLink
 * 		JSAPI支付--JsApi
 * =====================================================
 * 【CommonUtil】常用工具:
 * 		trimString(),設置參數時需要用到的字符處理函數
 * 		createNoncestr(),產生隨機字符串,不長於32位
 * 		formatBizQueryParaMap(),格式化參數,簽名過程需要用到
 * 		getSign(),生成簽名
 * 		arrayToXml(),array轉xml
 * 		xmlToArray(),xml轉 array
 * 		postXmlCurl(),以post方式提交xml到對應的接口url
 * 		postXmlSSLCurl(),使用證書,以post方式提交xml到對應的接口url
*/
	include_once("SDKRuntimeException.php");
	include_once("WxPay.pub.config.php");

/**
 * 所有接口的基類
 */
class Common_util_pub
{
	function __construct() {
	}

	function trimString($value)
	{
		$ret = null;
		if (null != $value) 
		{
			$ret = $value;
			if (strlen($ret) == 0) 
			{
				$ret = null;
			}
		}
		return $ret;
	}
	
	/**
	 * 	作用:產生隨機字符串,不長於32位
	 */
	public function createNoncestr( $length = 32 ) 
	{
		$chars = "abcdefghijklmnopqrstuvwxyz0123456789";  
		$str ="";
		for ( $i = 0; $i < $length; $i++ )  {  
			$str.= substr($chars, mt_rand(0, strlen($chars)-1), 1);  
		}  
		return $str;
	}
	
	/**
	 * 	作用:格式化參數,簽名過程需要使用
	 */
	function formatBizQueryParaMap($paraMap, $urlencode)
	{
		$buff = "";
		ksort($paraMap);
		foreach ($paraMap as $k => $v)
		{
		    if($urlencode)
		    {
			   $v = urlencode($v);
			}
			//$buff .= strtolower($k) . "=" . $v . "&";
			$buff .= $k . "=" . $v . "&";
		}
		$reqPar;
		if (strlen($buff) > 0) 
		{
			$reqPar = substr($buff, 0, strlen($buff)-1);
		}
		return $reqPar;
	}
	
	/**
	 * 	作用:生成簽名
	 */
	public function getSign($Obj)
	{
		foreach ($Obj as $k => $v)
		{
			$Parameters[$k] = $v;
		}
		//簽名步驟一:按字典序排序參數
		ksort($Parameters);
		$String = $this->formatBizQueryParaMap($Parameters, false);
		//echo '【string1】'.$String.'</br>';
		//簽名步驟二:在string后加入KEY
		$String = $String."&key=".WxPayConf_pub::KEY;
		//echo "【string2】".$String."</br>";
		//簽名步驟三:MD5加密
		$String = md5($String);
		//echo "【string3】 ".$String."</br>";
		//簽名步驟四:所有字符轉為大寫
		$result_ = strtoupper($String);
		//echo "【result】 ".$result_."</br>";
		return $result_;
	}
	
	/**
	 * 	作用:array轉xml
	 */
	function arrayToXml($arr)
    {
        $xml = "<xml>";
        foreach ($arr as $key=>$val)
        {
        	 if (is_numeric($val))
        	 {
        	 	$xml.="<".$key.">".$val."</".$key.">"; 

        	 }
        	 else
        	 	$xml.="<".$key."><![CDATA[".$val."]]></".$key.">";  
        }
        $xml.="</xml>";
        return $xml; 
    }
	
	/**
	 * 	作用:將xml轉為array
	 */
	public function xmlToArray($xml)
	{		
        //將XML轉為array        
        $array_data = json_decode(json_encode(simplexml_load_string($xml, 'SimpleXMLElement', LIBXML_NOCDATA)), true);		
		return $array_data;
	}

	/**
	 * 	作用:以post方式提交xml到對應的接口url
	 */
	public function postXmlCurl($xml,$url,$second=30)
	{		
        //初始化curl        
       	$ch = curl_init();
		//設置超時
		curl_setopt($ch, CURLOP_TIMEOUT, $second);
        //這里設置代理,如果有的話
        //curl_setopt($ch,CURLOPT_PROXY, '8.8.8.8');
        //curl_setopt($ch,CURLOPT_PROXYPORT, 8080);
        curl_setopt($ch,CURLOPT_URL, $url);
        curl_setopt($ch,CURLOPT_SSL_VERIFYPEER,FALSE);
        curl_setopt($ch,CURLOPT_SSL_VERIFYHOST,FALSE);
		//設置header
		curl_setopt($ch, CURLOPT_HEADER, FALSE);
		//要求結果為字符串且輸出到屏幕上
        curl_setopt($ch, CURLOPT_RETURNTRANSFER, TRUE);
		//post提交方式
		curl_setopt($ch, CURLOPT_POST, TRUE);
		curl_setopt($ch, CURLOPT_POSTFIELDS, $xml);
		//運行curl
        $data = curl_exec($ch);
		curl_close($ch);
		//返回結果
		if($data)
		{
			curl_close($ch);
			return $data;
		}
		else 
		{ 
			$error = curl_errno($ch);
			echo "curl出錯,錯誤碼:$error"."<br>"; 
			echo "<a href='http://curl.haxx.se/libcurl/c/libcurl-errors.html'>錯誤原因查詢</a></br>";
			curl_close($ch);
			return false;
		}
	}

	/**
	 * 	作用:使用證書,以post方式提交xml到對應的接口url
	 */
	function postXmlSSLCurl($xml,$url,$second=30)
	{
		$ch = curl_init();
		//超時時間
		curl_setopt($ch,CURLOPT_TIMEOUT,$second);
		//這里設置代理,如果有的話
        //curl_setopt($ch,CURLOPT_PROXY, '8.8.8.8');
        //curl_setopt($ch,CURLOPT_PROXYPORT, 8080);
        curl_setopt($ch,CURLOPT_URL, $url);
        curl_setopt($ch,CURLOPT_SSL_VERIFYPEER,FALSE);
        curl_setopt($ch,CURLOPT_SSL_VERIFYHOST,FALSE);
		//設置header
		curl_setopt($ch,CURLOPT_HEADER,FALSE);
		//要求結果為字符串且輸出到屏幕上
		curl_setopt($ch,CURLOPT_RETURNTRANSFER,TRUE);
		//設置證書
		//使用證書:cert 與 key 分別屬於兩個.pem文件
		//默認格式為PEM,可以注釋
// 		curl_setopt($ch,CURLOPT_SSLCERTTYPE,'PEM');
// 		curl_setopt($ch,CURLOPT_SSLCERT,WxPayConf_pub::SSLCERT_PATH );
// 		//默認格式為PEM,可以注釋
// 		curl_setopt($ch,CURLOPT_SSLKEYTYPE,'PEM');
// 		curl_setopt($ch,CURLOPT_SSLKEY, WxPayConf_pub::SSLKEY_PATH);
		
		curl_setopt($ch, CURLOPT_SSLCERT,WxPayConf_pub::SSLCERT_PATH);
		curl_setopt($ch, CURLOPT_SSLKEY,WxPayConf_pub::SSLKEY_PATH);
		curl_setopt($ch, CURLOPT_CAINFO, WxPayConf_pub::SSLCA_PATH); // CA根證書(用來驗證的網站證書是否是CA頒布)
		
		
		//post提交方式
		curl_setopt($ch,CURLOPT_POST, true);
		curl_setopt($ch,CURLOPT_POSTFIELDS,$xml);
		$data = curl_exec($ch);
		//返回結果
		if($data){
			curl_close($ch);
			return $data;
		}
		else { 
			$error = curl_errno($ch);
			echo "curl出錯,錯誤碼:$error"."<br>"; 
			echo "<a href='http://curl.haxx.se/libcurl/c/libcurl-errors.html'>錯誤原因查詢</a></br>";
			curl_close($ch);
			return false;
		}
	}
	
	/**
	 * 	作用:打印數組
	 */
	function printErr($wording='',$err='')
	{
		print_r('<pre>');
		echo $wording."</br>";
		var_dump($err);
		print_r('</pre>');
	}
}

/**
 * 請求型接口的基類
 */
class Wxpay_client_pub extends Common_util_pub 
{
	var $parameters;//請求參數,類型為關聯數組
	public $response;//微信返回的響應
	public $result;//返回參數,類型為關聯數組
	var $url;//接口鏈接
	var $curl_timeout;//curl超時時間
	
	/**
	 * 	作用:設置請求參數
	 */
	function setParameter($parameter, $parameterValue)
	{
		$this->parameters[$this->trimString($parameter)] = $this->trimString($parameterValue);
	}
	
	/**
	 * 	作用:設置標配的請求參數,生成簽名,生成接口參數xml
	 */
	function createXml()
	{
	   	$this->parameters["appid"] = WxPayConf_pub::APPID;//公眾賬號ID
	   	$this->parameters["mch_id"] = WxPayConf_pub::MCHID;//商戶號
	    $this->parameters["nonce_str"] = $this->createNoncestr();//隨機字符串
	    $this->parameters["sign"] = $this->getSign($this->parameters);//簽名
	    return  $this->arrayToXml($this->parameters);
	}
	
	/**
	 * 	作用:post請求xml
	 */
	function postXml()
	{
	    $xml = $this->createXml();
		$this->response = $this->postXmlCurl($xml,$this->url,$this->curl_timeout);
		return $this->response;
	}
	
	/**
	 * 	作用:使用證書post請求xml
	 */
	function postXmlSSL()
	{	
	    $xml = $this->createXml();
		$this->response = $this->postXmlSSLCurl($xml,$this->url,$this->curl_timeout);
		return $this->response;
	}

	/**
	 * 	作用:獲取結果,默認不使用證書
	 */
	function getResult() 
	{		
		$this->postXml();
		$this->result = $this->xmlToArray($this->response);
		return $this->result;
	}
}


/**
 * 統一支付接口類
 */
class UnifiedOrder_pub extends Wxpay_client_pub
{	
	function __construct() 
	{
		//設置接口鏈接
		$this->url = "https://api.mch.weixin.qq.com/pay/unifiedorder";
		//設置curl超時時間
		$this->curl_timeout = WxPayConf_pub::CURL_TIMEOUT;
	}
	
	/**
	 * 生成接口參數xml
	 */
	function createXml()
	{
		try
		{
			//檢測必填參數
			if($this->parameters["out_trade_no"] == null) 
			{
				throw new SDKRuntimeException("缺少統一支付接口必填參數out_trade_no!"."<br>");
			}elseif($this->parameters["body"] == null){
				throw new SDKRuntimeException("缺少統一支付接口必填參數body!"."<br>");
			}elseif ($this->parameters["total_fee"] == null ) {
				throw new SDKRuntimeException("缺少統一支付接口必填參數total_fee!"."<br>");
			}elseif ($this->parameters["notify_url"] == null) {
				throw new SDKRuntimeException("缺少統一支付接口必填參數notify_url!"."<br>");
			}elseif ($this->parameters["trade_type"] == null) {
				throw new SDKRuntimeException("缺少統一支付接口必填參數trade_type!"."<br>");
			}elseif ($this->parameters["trade_type"] == "JSAPI" &&
				$this->parameters["openid"] == NULL){
				throw new SDKRuntimeException("統一支付接口中,缺少必填參數openid!trade_type為JSAPI時,openid為必填參數!"."<br>");
			}
		   	$this->parameters["appid"] = WxPayConf_pub::APPID;//公眾賬號ID
		   	$this->parameters["mch_id"] = WxPayConf_pub::MCHID;//商戶號
		   	$this->parameters["spbill_create_ip"] = $_SERVER['REMOTE_ADDR'];//終端ip	    
		    $this->parameters["nonce_str"] = $this->createNoncestr();//隨機字符串
		    $this->parameters["sign"] = $this->getSign($this->parameters);//簽名
		    return  $this->arrayToXml($this->parameters);
		}catch (SDKRuntimeException $e)
		{
			die($e->errorMessage());
		}
	}
	
	/**
	 * 獲取prepay_id
	 */
	function getPrepayId()
	{
		$this->postXml();
		$this->result = $this->xmlToArray($this->response);
		$prepay_id = $this->result["prepay_id"];
		return $prepay_id;
	}
	
}

/**
 * 訂單查詢接口
 */
class OrderQuery_pub extends Wxpay_client_pub
{
	function __construct() 
	{
		//設置接口鏈接
		$this->url = "https://api.mch.weixin.qq.com/pay/orderquery";
		//設置curl超時時間
		$this->curl_timeout = WxPayConf_pub::CURL_TIMEOUT;		
	}

	/**
	 * 生成接口參數xml
	 */
	function createXml()
	{
		try
		{
			//檢測必填參數
			if($this->parameters["out_trade_no"] == null && 
				$this->parameters["transaction_id"] == null) 
			{
				throw new SDKRuntimeException("訂單查詢接口中,out_trade_no、transaction_id至少填一個!"."<br>");
			}
		   	$this->parameters["appid"] = WxPayConf_pub::APPID;//公眾賬號ID
		   	$this->parameters["mch_id"] = WxPayConf_pub::MCHID;//商戶號
		    $this->parameters["nonce_str"] = $this->createNoncestr();//隨機字符串
		    $this->parameters["sign"] = $this->getSign($this->parameters);//簽名
		    return  $this->arrayToXml($this->parameters);
		}catch (SDKRuntimeException $e)
		{
			die($e->errorMessage());
		}
	}

}

/**
 * 退款申請接口
 */
class Refund_pub extends Wxpay_client_pub
{
	
	function __construct() {
		//設置接口鏈接
		$this->url = "https://api.mch.weixin.qq.com/secapi/pay/refund";
		//設置curl超時時間
		$this->curl_timeout = WxPayConf_pub::CURL_TIMEOUT;		
	}
	
	/**
	 * 生成接口參數xml
	 */
	function createXml()
	{
		try
		{
			//檢測必填參數
			if($this->parameters["out_trade_no"] == null && $this->parameters["transaction_id"] == null) {
				throw new SDKRuntimeException("退款申請接口中,out_trade_no、transaction_id至少填一個!"."<br>");
			}elseif($this->parameters["out_refund_no"] == null){
				throw new SDKRuntimeException("退款申請接口中,缺少必填參數out_refund_no!"."<br>");
			}elseif($this->parameters["total_fee"] == null){
				throw new SDKRuntimeException("退款申請接口中,缺少必填參數total_fee!"."<br>");
			}elseif($this->parameters["refund_fee"] == null){
				throw new SDKRuntimeException("退款申請接口中,缺少必填參數refund_fee!"."<br>");
			}elseif($this->parameters["op_user_id"] == null){
				throw new SDKRuntimeException("退款申請接口中,缺少必填參數op_user_id!"."<br>");
			}
		   	$this->parameters["appid"] = WxPayConf_pub::APPID;//公眾賬號ID
		   	$this->parameters["mch_id"] = WxPayConf_pub::MCHID;//商戶號
		    $this->parameters["nonce_str"] = $this->createNoncestr();//隨機字符串
		    $this->parameters["sign"] = $this->getSign($this->parameters);//簽名
		    return  $this->arrayToXml($this->parameters);
		}catch (SDKRuntimeException $e)
		{
			die($e->errorMessage());
		}
	}
	/**
	 * 	作用:獲取結果,使用證書通信
	 */
	function getResult() 
	{		
		$this->postXmlSSL();
		$this->result = $this->xmlToArray($this->response);
		return $this->result;
	}
	
}


/**
 * 退款查詢接口
 */
class RefundQuery_pub extends Wxpay_client_pub
{
	
	function __construct() {
		//設置接口鏈接
		$this->url = "https://api.mch.weixin.qq.com/pay/refundquery";
		//設置curl超時時間
		$this->curl_timeout = WxPayConf_pub::CURL_TIMEOUT;		
	}
	
	/**
	 * 生成接口參數xml
	 */
	function createXml()
	{		
		try 
		{
			if($this->parameters["out_refund_no"] == null &&
				$this->parameters["out_trade_no"] == null &&
				$this->parameters["transaction_id"] == null &&
				$this->parameters["refund_id "] == null) 
			{
				throw new SDKRuntimeException("退款查詢接口中,out_refund_no、out_trade_no、transaction_id、refund_id四個參數必填一個!"."<br>");
			}
		   	$this->parameters["appid"] = WxPayConf_pub::APPID;//公眾賬號ID
		   	$this->parameters["mch_id"] = WxPayConf_pub::MCHID;//商戶號
		    $this->parameters["nonce_str"] = $this->createNoncestr();//隨機字符串
		    $this->parameters["sign"] = $this->getSign($this->parameters);//簽名
		    return  $this->arrayToXml($this->parameters);
		}catch (SDKRuntimeException $e)
		{
			die($e->errorMessage());
		}
	}

	/**
	 * 	作用:獲取結果,使用證書通信
	 */
	function getResult() 
	{		
		$this->postXmlSSL();
		$this->result = $this->xmlToArray($this->response);
		return $this->result;
	}

}

/**
 * 對賬單接口
 */
class DownloadBill_pub extends Wxpay_client_pub
{

	function __construct() 
	{
		//設置接口鏈接
		$this->url = "https://api.mch.weixin.qq.com/pay/downloadbill";
		//設置curl超時時間
		$this->curl_timeout = WxPayConf_pub::CURL_TIMEOUT;		
	}

	/**
	 * 生成接口參數xml
	 */
	function createXml()
	{		
		try 
		{
			if($this->parameters["bill_date"] == null ) 
			{
				throw new SDKRuntimeException("對賬單接口中,缺少必填參數bill_date!"."<br>");
			}
		   	$this->parameters["appid"] = WxPayConf_pub::APPID;//公眾賬號ID
		   	$this->parameters["mch_id"] = WxPayConf_pub::MCHID;//商戶號
		    $this->parameters["nonce_str"] = $this->createNoncestr();//隨機字符串
		    $this->parameters["sign"] = $this->getSign($this->parameters);//簽名
		    return  $this->arrayToXml($this->parameters);
		}catch (SDKRuntimeException $e)
		{
			die($e->errorMessage());
		}
	}
	
	/**
	 * 	作用:獲取結果,默認不使用證書
	 */
	function getResult() 
	{		
		$this->postXml();
		$this->result = $this->xmlToArray($this->result_xml);
		return $this->result;
	}
	
	

}

/**
 * 短鏈接轉換接口
 */
class ShortUrl_pub extends Wxpay_client_pub
{
	function __construct() 
	{
		//設置接口鏈接
		$this->url = "https://api.mch.weixin.qq.com/tools/shorturl";
		//設置curl超時時間
		$this->curl_timeout = WxPayConf_pub::CURL_TIMEOUT;		
	}
	
	/**
	 * 生成接口參數xml
	 */
	function createXml()
	{		
		try 
		{
			if($this->parameters["long_url"] == null ) 
			{
				throw new SDKRuntimeException("短鏈接轉換接口中,缺少必填參數long_url!"."<br>");
			}
		   	$this->parameters["appid"] = WxPayConf_pub::APPID;//公眾賬號ID
		   	$this->parameters["mch_id"] = WxPayConf_pub::MCHID;//商戶號
		    $this->parameters["nonce_str"] = $this->createNoncestr();//隨機字符串
		    $this->parameters["sign"] = $this->getSign($this->parameters);//簽名
		    return  $this->arrayToXml($this->parameters);
		}catch (SDKRuntimeException $e)
		{
			die($e->errorMessage());
		}
	}
	
	/**
	 * 獲取prepay_id
	 */
	function getShortUrl()
	{
		$this->postXml();
		$prepay_id = $this->result["short_url"];
		return $prepay_id;
	}
	
}

/**
 * 響應型接口基類
 */
class Wxpay_server_pub extends Common_util_pub 
{
	public $data;//接收到的數據,類型為關聯數組
	var $returnParameters;//返回參數,類型為關聯數組
	
	/**
	 * 將微信的請求xml轉換成關聯數組,以方便數據處理
	 */
	function saveData($xml)
	{
		$this->data = $this->xmlToArray($xml);
	}
	
	function checkSign()
	{
		$tmpData = $this->data;
		unset($tmpData['sign']);
		$sign = $this->getSign($tmpData);//本地簽名
		if ($this->data['sign'] == $sign) {
			return TRUE;
		}
		return FALSE;
	}
	
	/**
	 * 獲取微信的請求數據
	 */
	function getData()
	{		
		return $this->data;
	}
	
	/**
	 * 設置返回微信的xml數據
	 */
	function setReturnParameter($parameter, $parameterValue)
	{
		$this->returnParameters[$this->trimString($parameter)] = $this->trimString($parameterValue);
	}
	
	/**
	 * 生成接口參數xml
	 */
	function createXml()
	{
		return $this->arrayToXml($this->returnParameters);
	}
	
	/**
	 * 將xml數據返回微信
	 */
	function returnXml()
	{
		$returnXml = $this->createXml();
		return $returnXml;
	}
}


/**
 * 通用通知接口
 */
class Notify_pub extends Wxpay_server_pub 
{

}




/**
 * 請求商家獲取商品信息接口
 */
class NativeCall_pub extends Wxpay_server_pub
{
	/**
	 * 生成接口參數xml
	 */
	function createXml()
	{
		if($this->returnParameters["return_code"] == "SUCCESS"){
		   	$this->returnParameters["appid"] = WxPayConf_pub::APPID;//公眾賬號ID
		   	$this->returnParameters["mch_id"] = WxPayConf_pub::MCHID;//商戶號
		    $this->returnParameters["nonce_str"] = $this->createNoncestr();//隨機字符串
		    $this->returnParameters["sign"] = $this->getSign($this->returnParameters);//簽名
		}
		return $this->arrayToXml($this->returnParameters);
	}
	
	/**
	 * 獲取product_id
	 */
	function getProductId()
	{
		$product_id = $this->data["product_id"];
		return $product_id;
	}
	
}

/**
 * 靜態鏈接二維碼
 */
class NativeLink_pub  extends Common_util_pub
{
	var $parameters;//靜態鏈接參數
	var $url;//靜態鏈接

	function __construct() 
	{
	}
	
	/**
	 * 設置參數
	 */
	function setParameter($parameter, $parameterValue) 
	{
		$this->parameters[$this->trimString($parameter)] = $this->trimString($parameterValue);
	}
	
	/**
	 * 生成Native支付鏈接二維碼
	 */
	function createLink()
	{
		try 
		{		
			if($this->parameters["product_id"] == null) 
			{
				throw new SDKRuntimeException("缺少Native支付二維碼鏈接必填參數product_id!"."<br>");
			}			
		   	$this->parameters["appid"] = WxPayConf_pub::APPID;//公眾賬號ID
		   	$this->parameters["mch_id"] = WxPayConf_pub::MCHID;//商戶號
		   	$time_stamp = time();
		   	$this->parameters["time_stamp"] = "$time_stamp";//時間戳
		    $this->parameters["nonce_str"] = $this->createNoncestr();//隨機字符串
		    $this->parameters["sign"] = $this->getSign($this->parameters);//簽名    		
			$bizString = $this->formatBizQueryParaMap($this->parameters, false);
		    $this->url = "weixin://wxpay/bizpayurl?".$bizString;
		}catch (SDKRuntimeException $e)
		{
			die($e->errorMessage());
		}
	}
	
	/**
	 * 返回鏈接
	 */
	function getUrl() 
	{		
		$this->createLink();
		return $this->url;
	}
}

/**
* JSAPI支付——H5網頁端調起支付接口
*/
class JsApi_pub extends Common_util_pub
{
	var $code;//code碼,用以獲取openid
	var $openid;//用戶的openid
	var $parameters;//jsapi參數,格式為json
	var $prepay_id;//使用統一支付接口得到的預支付id
	var $curl_timeout;//curl超時時間

	function __construct() 
	{
		//設置curl超時時間
		$this->curl_timeout = WxPayConf_pub::CURL_TIMEOUT;
	}
	
	/**
	 * 	作用:生成可以獲得code的url
	 */
	function createOauthUrlForCode($redirectUrl)
	{
		$urlObj["appid"] = WxPayConf_pub::APPID;
		$urlObj["redirect_uri"] = "$redirectUrl";
		$urlObj["response_type"] = "code";
		$urlObj["scope"] = "snsapi_base";
		$urlObj["state"] = "STATE"."#wechat_redirect";
		$bizString = $this->formatBizQueryParaMap($urlObj, false);
		return "https://open.weixin.qq.com/connect/oauth2/authorize?".$bizString;
	}

	/**
	 * 	作用:生成可以獲得openid的url
	 */
	function createOauthUrlForOpenid()
	{
		$urlObj["appid"] = WxPayConf_pub::APPID;
		$urlObj["secret"] = WxPayConf_pub::APPSECRET;
		$urlObj["code"] = $this->code;
		$urlObj["grant_type"] = "authorization_code";
		$bizString = $this->formatBizQueryParaMap($urlObj, false);
		return "https://api.weixin.qq.com/sns/oauth2/access_token?".$bizString;
	}
	
	
	/**
	 * 	作用:通過curl向微信提交code,以獲取openid
	 */
	function getOpenid()
	{
		$url = $this->createOauthUrlForOpenid();
        //初始化curl
       	$ch = curl_init();
		//設置超時
		curl_setopt($ch, CURLOP_TIMEOUT, $this->curl_timeout);
		curl_setopt($ch, CURLOPT_URL, $url);
        curl_setopt($ch,CURLOPT_SSL_VERIFYPEER,FALSE);
        curl_setopt($ch,CURLOPT_SSL_VERIFYHOST,FALSE);
		curl_setopt($ch, CURLOPT_HEADER, FALSE);
        curl_setopt($ch, CURLOPT_RETURNTRANSFER, TRUE);
		//運行curl,結果以jason形式返回
        $res = curl_exec($ch);
		curl_close($ch);
		//取出openid
		$data = json_decode($res,true);
		$this->openid = $data['openid'];
		return $this->openid;
	}

	/**
	 * 	作用:設置prepay_id
	 */
	function setPrepayId($prepayId)
	{
		$this->prepay_id = $prepayId;
	}

	/**
	 * 	作用:設置code
	 */
	function setCode($code_)
	{
		$this->code = $code_;
	}

	/**
	 * 	作用:設置jsapi的參數
	 */
	public function getParameters()
	{
		$jsApiObj["appId"] = WxPayConf_pub::APPID;
		$timeStamp = time();
	    $jsApiObj["timeStamp"] = "$timeStamp";
	    $jsApiObj["nonceStr"] = $this->createNoncestr();
		$jsApiObj["package"] = "prepay_id=$this->prepay_id";
	    $jsApiObj["signType"] = "MD5";
	    $jsApiObj["paySign"] = $this->getSign($jsApiObj);
	    $this->parameters = json_encode($jsApiObj);
		
		return $this->parameters;
	}
}



/**
 * 現金紅包接口
 * @author gaoyl101
 */
class Redpack_pub extends Wxpay_client_pub
{
	var $code;//code碼,用以獲取openid
	var $openid;//用戶的openid
	
	function __construct()
	{
		//設置接口鏈接
		$this->url = "https://api.mch.weixin.qq.com/mmpaymkttransfers/sendredpack";
		//設置curl超時時間
		$this->curl_timeout = WxPayConf_pub::CURL_TIMEOUT;
	}

	/**
	 * 生成接口參數xml
	 */
	function createXml()
	{
		try
		{
			//檢測必填參數
			if($this->parameters["mch_billno"] == null)
			{
				throw new SDKRuntimeException("缺少發紅包接口必填參數mch_billno!"."<br>");
			}elseif($this->parameters["nick_name"] == null){
				throw new SDKRuntimeException("缺少發紅包接口必填參數nick_name!"."<br>");
			}elseif ($this->parameters["send_name"] == null ) {
				throw new SDKRuntimeException("缺少發紅包接口必填參數send_name!"."<br>");
			}elseif ($this->parameters["total_amount"] == null) {
				throw new SDKRuntimeException("缺少發紅包接口必填參數total_amount!"."<br>");
			}elseif($this->parameters["min_value"] == null){
				throw new SDKRuntimeException("缺少發紅包接口必填參數min_value!"."<br>");
			}elseif ($this->parameters["max_value"] == null ) {
				throw new SDKRuntimeException("缺少發紅包接口必填參數max_value!"."<br>");
			}elseif ($this->parameters["total_num"] == null) {
				throw new SDKRuntimeException("缺少發紅包接口必填參數total_num!"."<br>");
			}elseif ($this->parameters["wishing"] == null) {
				throw new SDKRuntimeException("缺少發紅包接口必填參數wishing!"."<br>");
			}elseif ($this->parameters["act_name"] == null) {
				throw new SDKRuntimeException("缺少發紅包接口必填參數act_name!"."<br>");
			}elseif ($this->parameters["remark"] == null) {
				throw new SDKRuntimeException("缺少發紅包接口必填參數remark!"."<br>");
			}
			$this->parameters["wxappid"] = WxPayConf_pub::APPID;//公眾賬號ID
			$this->parameters["mch_id"] = WxPayConf_pub::MCHID;//商戶號
			$this->parameters["client_ip"] = $_SERVER['REMOTE_ADDR'];//終端ip
			$this->parameters["nonce_str"] = $this->createNoncestr();//隨機字符串
			$this->parameters["re_openid"] = $this->parameters["re_openid"];
			//$this->openid;//用戶openid
			$this->parameters["sign"] = $this->getSign($this->parameters);//簽名
			return  $this->arrayToXml($this->parameters);
		}catch (SDKRuntimeException $e)
		{
			die($e->errorMessage());
		}
	}
	
	
	function sendRedpack()
	{
		$this->postXmlSSL();
		$this->result = $this->xmlToArray($this->response);
		return $this->result;
	}
	
	
	
	/**
	 * 	作用:生成可以獲得code的url
	 */
	function createOauthUrlForCode($redirectUrl)
	{
		$urlObj["appid"] = WxPayConf_pub::APPID;
		$urlObj["redirect_uri"] = "$redirectUrl";
		$urlObj["response_type"] = "code";
		$urlObj["scope"] = "snsapi_base";
		$urlObj["state"] = "STATE"."#wechat_redirect";
		$bizString = $this->formatBizQueryParaMap($urlObj, false);
		return "https://open.weixin.qq.com/connect/oauth2/authorize?".$bizString;
	}
	
	
	
	/**
	 * 	作用:生成可以獲得openid的url
	 */
	function createOauthUrlForOpenid()
	{
		$urlObj["appid"] = WxPayConf_pub::APPID;
		$urlObj["secret"] = WxPayConf_pub::APPSECRET;
		$urlObj["code"] = $this->code;
		$urlObj["grant_type"] = "authorization_code";
		$bizString = $this->formatBizQueryParaMap($urlObj, false);
		return "https://api.weixin.qq.com/sns/oauth2/access_token?".$bizString;
	}
	
	/**
	 * 	作用:通過curl向微信提交code,以獲取openid
	 */
	function getOpenid()
	{
		$url = $this->createOauthUrlForOpenid();
        //初始化curl
       	$ch = curl_init();
		//設置超時
		curl_setopt($ch, CURLOP_TIMEOUT, $this->curl_timeout);
		curl_setopt($ch, CURLOPT_URL, $url);
        curl_setopt($ch,CURLOPT_SSL_VERIFYPEER,FALSE);
        curl_setopt($ch,CURLOPT_SSL_VERIFYHOST,FALSE);
		curl_setopt($ch, CURLOPT_HEADER, FALSE);
        curl_setopt($ch, CURLOPT_RETURNTRANSFER, TRUE);
		//運行curl,結果以jason形式返回
        $res = curl_exec($ch);
		curl_close($ch);
		//取出openid
		$data = json_decode($res,true);
		$this->openid = $data['openid'];
		return $this->openid;
	}
	
	/**
	 * 	作用:設置code
	 */
	function setCode($code_)
	{
		$this->code = $code_;
	}

}



/**
 * 紅包支付接口
 * @author gaoyl101
 */
class Groupredpack_pub extends Wxpay_client_pub
{
	var $code;//code碼,用以獲取openid
	var $openid;//用戶的openid

	function __construct()
	{
		//設置接口鏈接
		$this->url = "https://api.mch.weixin.qq.com/mmpaymkttransfers/sendgroupredpack";
		//設置curl超時時間
		$this->curl_timeout = WxPayConf_pub::CURL_TIMEOUT;
	}

	/**
	 * 生成接口參數xml
	 */
	function createXml()
	{
		try
		{
			//檢測必填參數
			if($this->parameters["mch_billno"] == null)
			{
				throw new SDKRuntimeException("缺少發紅包接口必填參數mch_billno!"."<br>");
			}elseif ($this->parameters["send_name"] == null ) {
				throw new SDKRuntimeException("缺少發紅包接口必填參數send_name!"."<br>");
			}elseif ($this->parameters["total_amount"] == null) {
				throw new SDKRuntimeException("缺少發紅包接口必填參數total_amount!"."<br>");
			}elseif ($this->parameters["total_num"] == null) {
				throw new SDKRuntimeException("缺少發紅包接口必填參數total_num!"."<br>");
			}elseif ($this->parameters["amt_type"] == null) {
				throw new SDKRuntimeException("缺少發紅包接口必填參數amt_type!"."<br>");
			}elseif ($this->parameters["wishing"] == null) {
				throw new SDKRuntimeException("缺少發紅包接口必填參數wishing!"."<br>");
			}elseif ($this->parameters["act_name"] == null) {
				throw new SDKRuntimeException("缺少發紅包接口必填參數act_name!"."<br>");
			}elseif ($this->parameters["remark"] == null) {
				throw new SDKRuntimeException("缺少發紅包接口必填參數remark!"."<br>");
			}
			$this->parameters["wxappid"] = WxPayConf_pub::APPID;//公眾賬號ID
			$this->parameters["mch_id"] = WxPayConf_pub::MCHID;//商戶號
			$this->parameters["nonce_str"] = $this->createNoncestr();//隨機字符串
			$this->parameters["re_openid"] = $this->openid;//用戶openid
			$this->parameters["sign"] = $this->getSign($this->parameters);//簽名
			return  $this->arrayToXml($this->parameters);
		}catch (SDKRuntimeException $e)
		{
			die($e->errorMessage());
		}
	}


	function sendRedpack()
	{
		$this->postXmlSSL();
		$this->result = $this->xmlToArray($this->response);
		return $this->result;
	}



	/**
	 * 	作用:生成可以獲得code的url
	 */
	function createOauthUrlForCode($redirectUrl)
	{
		$urlObj["appid"] = WxPayConf_pub::APPID;
		$urlObj["redirect_uri"] = "$redirectUrl";
		$urlObj["response_type"] = "code";
		$urlObj["scope"] = "snsapi_base";
		$urlObj["state"] = "STATE"."#wechat_redirect";
		$bizString = $this->formatBizQueryParaMap($urlObj, false);
		return "https://open.weixin.qq.com/connect/oauth2/authorize?".$bizString;
	}



	/**
	 * 	作用:生成可以獲得openid的url
	 */
	function createOauthUrlForOpenid()
	{
		$urlObj["appid"] = WxPayConf_pub::APPID;
		$urlObj["secret"] = WxPayConf_pub::APPSECRET;
		$urlObj["code"] = $this->code;
		$urlObj["grant_type"] = "authorization_code";
		$bizString = $this->formatBizQueryParaMap($urlObj, false);
		return "https://api.weixin.qq.com/sns/oauth2/access_token?".$bizString;
	}

	/**
	 * 	作用:通過curl向微信提交code,以獲取openid
	 */
	function getOpenid()
	{
		$url = $this->createOauthUrlForOpenid();
		//初始化curl
		$ch = curl_init();
		//設置超時
		curl_setopt($ch, CURLOP_TIMEOUT, $this->curl_timeout);
		curl_setopt($ch, CURLOPT_URL, $url);
		curl_setopt($ch,CURLOPT_SSL_VERIFYPEER,FALSE);
		curl_setopt($ch,CURLOPT_SSL_VERIFYHOST,FALSE);
		curl_setopt($ch, CURLOPT_HEADER, FALSE);
		curl_setopt($ch, CURLOPT_RETURNTRANSFER, TRUE);
		//運行curl,結果以jason形式返回
		$res = curl_exec($ch);
		curl_close($ch);
		//取出openid
		$data = json_decode($res,true);
		$this->openid = $data['openid'];
		return $this->openid;
	}

	/**
	 * 	作用:設置code
	 */
	function setCode($code_)
	{
		$this->code = $code_;
	}

}
/**
 * 搖一搖紅包預下單 
 * @author jiosen
 */
class Yhb_pub extends Wxpay_client_pub
{
	var $code;//code碼,用以獲取openid
	var $openid;//用戶的openid

	function __construct()
	{
		//設置接口鏈接
		$this->url = "https://api.mch.weixin.qq.com/mmpaymkttransfers/hbpreorder";
		//設置curl超時時間
		$this->curl_timeout = WxPayConf_pub::CURL_TIMEOUT;
	}

	/**
	 * 生成接口參數xml
	 */
	function createXml()
	{
		try
		{
			//檢測必填參數
			if($this->parameters["mch_billno"] == null)
			{
				throw new SDKRuntimeException("缺少發紅包接口必填參數mch_billno!"."<br>");
			}elseif ($this->parameters["send_name"] == null ) {
				throw new SDKRuntimeException("缺少發紅包接口必填參數send_name!"."<br>");
			}elseif ($this->parameters["total_amount"] == null) {
				throw new SDKRuntimeException("缺少發紅包接口必填參數total_amount!"."<br>");
			}elseif ($this->parameters["total_num"] == null) {
				throw new SDKRuntimeException("缺少發紅包接口必填參數total_num!"."<br>");
			}elseif ($this->parameters["wishing"] == null) {
				throw new SDKRuntimeException("缺少發紅包接口必填參數wishing!"."<br>");
			}elseif ($this->parameters["act_name"] == null) {
				throw new SDKRuntimeException("缺少發紅包接口必填參數act_name!"."<br>");
			}elseif ($this->parameters["remark"] == null) {
				throw new SDKRuntimeException("缺少發紅包接口必填參數remark!"."<br>");
			}
			$this->parameters["wxappid"] = WxPayConf_pub::APPID;//公眾賬號ID
			$this->parameters["mch_id"] = WxPayConf_pub::MCHID;//商戶號
			$this->parameters["nonce_str"] = $this->createNoncestr();//隨機字符串
			//$this->parameters["re_openid"] = $this->openid;//用戶openid
			$this->parameters["hb_type"] = 'NORMAL';//紅包類型 NORMAL-普通紅包;GROUP-裂變紅包(可分享紅包給好友,無關注公眾號能力)。 
			$this->parameters["auth_mchid"] = '1000052601';//搖周邊商戶號
			$this->parameters["auth_appid"] = 'wxbf42bd79c4391863';//搖周邊 appid
			$this->parameters["risk_cntl"] = 'NORMAL';//風控設置
			$this->parameters["sign"] = $this->getSign($this->parameters);//簽名
			//echo json_encode($this->parameters);die;
			return  $this->arrayToXml($this->parameters);
			//echo $this->parameters["auth_appid"].'--'.$this->parameters["auth_mchid"];die;
		}catch (SDKRuntimeException $e)
		{
			die($e->errorMessage());
		}
	}


	function hbpreorder()
	{
		$this->postXmlSSL();
		$this->result = $this->xmlToArray($this->response);
		return $this->result;
	}



	/**
	 * 	作用:生成可以獲得code的url
	 */
	function createOauthUrlForCode($redirectUrl)
	{
		$urlObj["appid"] = WxPayConf_pub::APPID;
		$urlObj["redirect_uri"] = "$redirectUrl";
		$urlObj["response_type"] = "code";
		$urlObj["scope"] = "snsapi_base";
		$urlObj["state"] = "STATE"."#wechat_redirect";
		$bizString = $this->formatBizQueryParaMap($urlObj, false);
		return "https://open.weixin.qq.com/connect/oauth2/authorize?".$bizString;
	}



	/**
	 * 	作用:生成可以獲得openid的url
	 */
	function createOauthUrlForOpenid()
	{
		$urlObj["appid"] = WxPayConf_pub::APPID;
		$urlObj["secret"] = WxPayConf_pub::APPSECRET;
		$urlObj["code"] = $this->code;
		$urlObj["grant_type"] = "authorization_code";
		$bizString = $this->formatBizQueryParaMap($urlObj, false);
		return "https://api.weixin.qq.com/sns/oauth2/access_token?".$bizString;
	}

	/**
	 * 	作用:通過curl向微信提交code,以獲取openid
	 */
	function getOpenid()
	{
		$url = $this->createOauthUrlForOpenid();
		//初始化curl
		$ch = curl_init();
		//設置超時
		curl_setopt($ch, CURLOP_TIMEOUT, $this->curl_timeout);
		curl_setopt($ch, CURLOPT_URL, $url);
		curl_setopt($ch,CURLOPT_SSL_VERIFYPEER,FALSE);
		curl_setopt($ch,CURLOPT_SSL_VERIFYHOST,FALSE);
		curl_setopt($ch, CURLOPT_HEADER, FALSE);
		curl_setopt($ch, CURLOPT_RETURNTRANSFER, TRUE);
		//運行curl,結果以jason形式返回
		$res = curl_exec($ch);
		curl_close($ch);
		//取出openid
		$data = json_decode($res,true);
		$this->openid = $data['openid'];
		return $this->openid;
	}

	/**
	 * 	作用:設置code
	 */
	function setCode($code_)
	{
		$this->code = $code_;
	}

}
/**
 * 搖一搖紅包 創建活動
 * @author jiosen
 */
class addlotteryinfo_pub extends Wxpay_client_pub
{
	var $code;//code碼,用以獲取openid
	var $openid;//用戶的openid

	function __construct($access_token,$logo)
	{
		//設置接口鏈接
		$this->url = "https://api.weixin.qq.com/shakearound/lottery/addlotteryinfo?access_token=".$access_token."&use_template=1&logo_url=".$logo;
		//設置curl超時時間
		$this->curl_timeout = WxPayConf_pub::CURL_TIMEOUT;
	}

	/**
	 * 生成接口參數  json
	 */
	function createJson()
	{
		try
		{
			//檢測必填參數
			if($this->parameters["title"] == null)
			{
				throw new SDKRuntimeException("缺少抽獎活動名稱title!"."<br>");
			}elseif ($this->parameters["desc"] == null ) {
				throw new SDKRuntimeException("缺少抽獎活動描述desc!"."<br>");
			}elseif ($this->parameters["begin_time"] == null) {
				throw new SDKRuntimeException("缺少活動開始時間 begin_time!"."<br>");
			}elseif ($this->parameters["expire_time"] == null) {
				throw new SDKRuntimeException("缺少活動結束時間 expire_time!"."<br>");
			}elseif ($this->parameters["total"] == null) {
				throw new SDKRuntimeException("缺少紅包總數total!"."<br>");
			}elseif ($this->parameters["jump_url"] == null) {
				throw new SDKRuntimeException("缺少紅包關注跳轉連接jump_url!"."<br>");
			}elseif ($this->parameters["key"] == null) {
				throw new SDKRuntimeException("缺少紅包key!"."<br>");
			}
			$this->parameters["title"] = urlencode($this->parameters["title"]);
			$this->parameters["desc"] = urlencode($this->parameters["desc"]);
			$this->parameters["onoff"] = '0';//開啟活動
			$this->parameters["sponsor_appid"] = WxPayConf_pub::APPID;//公眾賬號ID
			//var_dump($this->parameters);
			//echo json_encode($this->parameters);
			return  json_encode($this->parameters);
		}catch (SDKRuntimeException $e)
		{
			die($e->errorMessage());
		}
	}


	function hbpreorder()
	{
		$data = $this->createJson();
		$result = $this->curl_post($this->url,urldecode($data));
		$result = json_decode($result);
		return $result;
	}

	function curl_post($url,$data)
    {
        $curl = curl_init($url);
        curl_setopt($curl, CURLOPT_CONNECTTIMEOUT, 30);
        curl_setopt($curl, CURLOPT_TIMEOUT, 10);
        curl_setopt($curl, CURLOPT_RETURNTRANSFER, TRUE);
        curl_setopt($curl, CURLOPT_SSL_VERIFYPEER, false);
        curl_setopt($curl, CURLOPT_POST, 1);//發送一個常規的Post請求
    	curl_setopt($curl, CURLOPT_POSTFIELDS, $data);//Post提交的數據包
        $rv = curl_exec($curl);//輸出內容
        curl_close($curl);
        return $rv;
    }

	/**
	 * 	作用:生成可以獲得code的url
	 */
	function createOauthUrlForCode($redirectUrl)
	{
		$urlObj["appid"] = WxPayConf_pub::APPID;
		$urlObj["redirect_uri"] = "$redirectUrl";
		$urlObj["response_type"] = "code";
		$urlObj["scope"] = "snsapi_base";
		$urlObj["state"] = "STATE"."#wechat_redirect";
		$bizString = $this->formatBizQueryParaMap($urlObj, false);
		return "https://open.weixin.qq.com/connect/oauth2/authorize?".$bizString;
	}



	/**
	 * 	作用:生成可以獲得openid的url
	 */
	function createOauthUrlForOpenid()
	{
		$urlObj["appid"] = WxPayConf_pub::APPID;
		$urlObj["secret"] = WxPayConf_pub::APPSECRET;
		$urlObj["code"] = $this->code;
		$urlObj["grant_type"] = "authorization_code";
		$bizString = $this->formatBizQueryParaMap($urlObj, false);
		return "https://api.weixin.qq.com/sns/oauth2/access_token?".$bizString;
	}

	/**
	 * 	作用:通過curl向微信提交code,以獲取openid
	 */
	function getOpenid()
	{
		$url = $this->createOauthUrlForOpenid();
		//初始化curl
		$ch = curl_init();
		//設置超時
		curl_setopt($ch, CURLOP_TIMEOUT, $this->curl_timeout);
		curl_setopt($ch, CURLOPT_URL, $url);
		curl_setopt($ch,CURLOPT_SSL_VERIFYPEER,FALSE);
		curl_setopt($ch,CURLOPT_SSL_VERIFYHOST,FALSE);
		curl_setopt($ch, CURLOPT_HEADER, FALSE);
		curl_setopt($ch, CURLOPT_RETURNTRANSFER, TRUE);
		//運行curl,結果以jason形式返回
		$res = curl_exec($ch);
		curl_close($ch);
		//取出openid
		$data = json_decode($res,true);
		$this->openid = $data['openid'];
		return $this->openid;
	}

	/**
	 * 	作用:設置code
	 */
	function setCode($code_)
	{
		$this->code = $code_;
	}

}
/**
 * 搖一搖紅包 錄入紅包
 * @author jiosen
 */
class lottery_pub extends Wxpay_client_pub
{
	var $code;//code碼,用以獲取openid
	var $openid;//用戶的openid

	function __construct($access_token)
	{
		//設置接口鏈接
		$this->url = "https://api.weixin.qq.com/shakearound/lottery/setprizebucket?access_token=".$access_token;
		//設置curl超時時間
		$this->curl_timeout = WxPayConf_pub::CURL_TIMEOUT;
	}

	/**
	 * 生成接口參數  json
	 */
	function createJson()
	{
		try
		{
			//檢測必填參數
			if($this->parameters["lottery_id"] == null)
			{
				throw new SDKRuntimeException("缺少抽獎活動id lottery_id !"."<br>");
			}else if(empty($this->parameters["prize_info_list"])){
				throw new SDKRuntimeException("缺少抽獎活動紅包 prize_info_list !"."<br>");
			}

			$this->parameters["mchid"] = WxPayConf_pub::MCHID;//授權商戶號
			$this->parameters["sponsor_appid"] = WxPayConf_pub::APPID;//授權上號appid
			return  json_encode($this->parameters);
			//echo json_encode($this->parameters);die;
		}catch (SDKRuntimeException $e)
		{
			die($e->errorMessage());
		}
	}

	function setJsonArray($parameter, $parameterValue){
		$this->parameters[$this->trimString($parameter)] = $parameterValue;
	}
	function hbpreorder()
	{
		$data = $this->createJson();
		$result = $this->curl_post($this->url,$data);
		$result = json_decode($result);
		return $result;
	}

	function curl_post($url,$data)
    {
        $curl = curl_init($url);
        curl_setopt($curl, CURLOPT_CONNECTTIMEOUT, 30);
        curl_setopt($curl, CURLOPT_TIMEOUT, 10);
        curl_setopt($curl, CURLOPT_RETURNTRANSFER, TRUE);
        curl_setopt($curl, CURLOPT_SSL_VERIFYPEER, false);
        curl_setopt($curl, CURLOPT_POST, 1);//發送一個常規的Post請求
    	curl_setopt($curl, CURLOPT_POSTFIELDS, $data);//Post提交的數據包
        $rv = curl_exec($curl);//輸出內容
        curl_close($curl);
        return $rv;
    }

	/**
	 * 	作用:生成可以獲得code的url
	 */
	function createOauthUrlForCode($redirectUrl)
	{
		$urlObj["appid"] = WxPayConf_pub::APPID;
		$urlObj["redirect_uri"] = "$redirectUrl";
		$urlObj["response_type"] = "code";
		$urlObj["scope"] = "snsapi_base";
		$urlObj["state"] = "STATE"."#wechat_redirect";
		$bizString = $this->formatBizQueryParaMap($urlObj, false);
		return "https://open.weixin.qq.com/connect/oauth2/authorize?".$bizString;
	}



	/**
	 * 	作用:生成可以獲得openid的url
	 */
	function createOauthUrlForOpenid()
	{
		$urlObj["appid"] = WxPayConf_pub::APPID;
		$urlObj["secret"] = WxPayConf_pub::APPSECRET;
		$urlObj["code"] = $this->code;
		$urlObj["grant_type"] = "authorization_code";
		$bizString = $this->formatBizQueryParaMap($urlObj, false);
		return "https://api.weixin.qq.com/sns/oauth2/access_token?".$bizString;
	}

	/**
	 * 	作用:通過curl向微信提交code,以獲取openid
	 */
	function getOpenid()
	{
		$url = $this->createOauthUrlForOpenid();
		//初始化curl
		$ch = curl_init();
		//設置超時
		curl_setopt($ch, CURLOP_TIMEOUT, $this->curl_timeout);
		curl_setopt($ch, CURLOPT_URL, $url);
		curl_setopt($ch,CURLOPT_SSL_VERIFYPEER,FALSE);
		curl_setopt($ch,CURLOPT_SSL_VERIFYHOST,FALSE);
		curl_setopt($ch, CURLOPT_HEADER, FALSE);
		curl_setopt($ch, CURLOPT_RETURNTRANSFER, TRUE);
		//運行curl,結果以jason形式返回
		$res = curl_exec($ch);
		curl_close($ch);
		//取出openid
		$data = json_decode($res,true);
		$this->openid = $data['openid'];
		return $this->openid;
	}

	/**
	 * 	作用:設置code
	 */
	function setCode($code_)
	{
		$this->code = $code_;
	}

}
?>

 





免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM