早上老大扔了個設備來說要做個搖一搖紅包 就上網找了下 強大的度娘都找不到大神們分享出來的源碼 只能自己埋頭去寫寫了微信官方說明如下搖一搖紅包說明功能說明搖一搖周邊紅包介面是為線下商戶提供的發紅包功能。用戶可以在商家門店等線下場所通過搖一搖周邊領取商家發放的紅包,線上上轉發分享無效。開發者可通過介面開...
早上老大扔了個設備來說要做個搖一搖紅包 就上網找了下 強大的度娘都找不到大神們分享出來的源碼 只能自己埋頭去寫寫了
微信官方說明如下
搖一搖紅包說明
功能說明
搖一搖周邊紅包介面是為線下商戶提供的發紅包功能。用戶可以在商家門店等線下場所通過搖一搖周邊領取商家發放的紅包,線上上轉發分享無效。
開發者可通過介面開發搖一搖紅包功能,特點包括:
- 可選擇使用模板載入頁或自定義Html5頁面調起微信原生紅包頁面(詳見創建紅包活動中use_template欄位,1為使用模板,2為使用自定義Html5頁面)
- 原生紅包頁面拆紅包,無需通過公眾號消息下發
- 提供關註公眾號能力,用戶可自行選擇是否關註(裂變紅包分享時無效)
- 完成頁面可配置跳轉鏈接,可跳轉商戶的其他自定義Html5頁面
- 同一個用戶在單個紅包活動中只能領取1次紅包
用戶側交互流程
紅包組件介面調用流程
- 申請紅包介面許可權:登錄搖一搖周邊商戶後臺https://zb.weixin.qq.com ,進入開發者支持,申請開通搖一搖紅包組件介面;
- 紅包預下單:調用微信支付的api進行紅包預下單,告知需要發放的紅包金額,人數,生成紅包ticket;
- 創建活動並錄入紅包信息:調用搖周邊平臺的api錄入創建紅包活動並錄入信息,傳入預下單時生成的紅包ticket;
- 調用jsapi抽紅包:在搖出的頁面中通過調用jsapi抽紅包,抽中紅包的用戶可以拆紅包;
- 調用以上介面時,紅包提供商戶和紅包發放商戶公眾號要求一致。
說明: 紅包提供商戶:紅包預下單介面傳入的參數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"] = $