Home >Backend Development >PHP Tutorial >微信摇一摇周边 红包,摇周边红包_PHP教程
早上老大扔了个设备来说要做个摇一摇红包 就上网找了下 强大的度娘都找不到大神们分享出来的源码 只能自己埋头去写写了
微信官方说明如下
功能说明
摇一摇周边红包接口是为线下商户提供的发红包功能。用户可以在商家门店等线下场所通过摇一摇周边领取商家发放的红包,在线上转发分享无效。
开发者可通过接口开发摇一摇红包功能,特点包括:
用户侧交互流程
红包组件接口调用流程
说明: 红包提供商户:红包预下单接口传入的参数wxappid所代表的商户 红包发放商户:调用红包接口创建红包活动、录入红包信息、发放红包的商户公众号<br /><br />所以步骤应该是 ① 创建红包活动 ② 预下单 ③ 录入红包<br />找出来了之前整理的类 在写一下<br /><br /><span><strong>1.创建活动<br /></strong></span>
接口说明
创建红包活动,设置红包活动有效期,红包活动开关等基本信息,返回活动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, }
<span><strong><br /><span></span></strong></span>
/** * 摇一摇红包 创建活动 * @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']; //这里是错误提示 }
<span><strong>2.预下单</strong></span>
接口说明
设置单个红包的金额,类型等,生成红包信息。预下单完成后,需要在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 和商户号
<br /><br />调用 (这里不贴前端页面了)
$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[''])
<br /><br />
<span><strong>3.录入红包</strong></span>
接口说明
在调用"创建红包活动"接口之后,调用此接口录入红包信息。注意,此接口每次调用,都会向某个活动新增一批红包信息,如果红包数少于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_; } }
调用
<br /> $token = getAccessToken();<br /> $Redpack = new \lottery_pub($token);<br /> $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 class="brush:php;toolbar:false">'); echo $wording."</br>"; var_dump($err); print_r(''); } } /** * 请求型接口的基类 */ 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!"."