微信搖一搖周邊 紅包

来源:http://www.cnblogs.com/jiosen/archive/2016/01/04/jiosen.html
-Advertisement-
Play Games

早上老大扔了個設備來說要做個搖一搖紅包 就上網找了下 強大的度娘都找不到大神們分享出來的源碼 只能自己埋頭去寫寫了微信官方說明如下搖一搖紅包說明功能說明搖一搖周邊紅包介面是為線下商戶提供的發紅包功能。用戶可以在商家門店等線下場所通過搖一搖周邊領取商家發放的紅包,線上上轉發分享無效。開發者可通過介面開...


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

微信官方說明如下

搖一搖紅包說明

功能說明

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

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

  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"] = $

您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 基礎拾遺 序列解包 例: >>>x,y,z=1,2,3 >>>print x,y,z 1 2 3 交換變數也是沒問題 >>>x,y=y,x >>>print x,y,z 2 1 3 #這個很實用 當函數或方法返回元組(或其它序列或可迭代對象)時,這個特性特別有用。假如需要獲取(和刪除)字典中任意的鍵...
  • [新年新氣象,2016/01/04] 俺們在開發IOS程式過程中,經常需要用到NSLog輸出一些信息,甚至有的開發過程,必須在控制台查看輸出,有經驗的程式員通過控制台輸出就能知道整個數據交互的一個流程。但是一個發佈的程式,裡面帶有太多的NSLog輸出,肯定對於App性能有所影響,這時候我們可以...
  • 版權聲明:本文為博主原創文章,未經博主允許不得轉載。描述:烏龜和兔子(各自是一個Java線程)在我們的電腦上賽跑,我們為它們指定一個跑道(本地文件系統上的一個目錄,該目錄包含子目錄)。跑的規則是讀“跑道”上的所有文件。兔子很聰明,只讀文件的元信息(路徑名、大小、最後修改時間),但每讀完一個文件就要睡...
  • 主要使用了java.lang.reflect中的Proxy類,方法如下:static Object newProxyInstance(ClassLoader loader, Class[] interfaces, InvocationHandler h)下麵是利用JDBC做的測試,類似於重寫了Con...
  • php -v 是linux系統的php版本,而phpinfo里顯示的是WEB Server中配置的版本。說簡單點,你的系統中有兩個php版本。
  • 線程的一些主要狀態以及狀態之間的裝換 (如下圖)主要狀態為:1.新建 2.就緒3.運行 4阻塞 5.死亡 其中:join()可以用來邀請其他線程先執行 yield()告訴系統"把自己的CPU時間讓掉,讓其他線程或者自己運行"引入線程的好處:1 創建一個線程花費的時間少。2 兩個線...
  • python列表排序 python字典排序 sortedList的元素可以是各種東西,字元串,字典,自己定義的類等。sorted函數用法如下:sorted(data, cmp=None, key=None, reverse=False) 其中,data是待排序數據,可以使List或者iter...
  • 在開發中遇到將form中的name值一樣的多個input元素傳遞到後臺,我用的是springmvc。剛開始的時候老是報400的請求錯誤。後來查了下資料,其實解決方案挺簡單的。我的後臺controller的代碼如下: 1 @RequestMapping(value = { "/examine" }, ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...