使用PHP实现微信摇一摇周边红包

最近接了个项目,其中有需求是要实现摇一摇红包功能,在网上搜了好久,都没有找到源码,没办法,只有自动写了,下面小编把我的劳动成果分享给大家供大家参考,本文写的不好,还请各位大侠提出宝贵意见,共同学习进步。

微信官方说明如下

摇一摇红包说明

功能说明

摇一摇周边红包接口是为线下商户提供的发红包功能。用户可以在商家门店等线下场所通过摇一摇周边领取商家发放的红包,在线上转发分享无效。

开发者可通过接口开发摇一摇红包功能,特点包括:
 1.可选择使用模板加载页或自定义Html5页面调起微信原生红包页面(详见创建红包活动中use_template字段,1为使用模板,2为使用自定义Html5页面)
 2.原生红包页面拆红包,无需通过公众号消息下发
 3.提供关注公众号能力,用户可自行选择是否关注(裂变红包分享时无效)
 4.完成页面可配置跳转链接,可跳转商户的其他自定义Html5页面
 5.同一个用户在单个红包活动中只能领取1次红包

用户侧交互流程

红包组件接口调用流程

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

请求参数说明

请求示例

 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":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

需要商户证书

请求参数说明

请求示例

<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>

返回数据说明

以下字段在return_code 和result_code都为SUCCESS的时候有返回

成功示例

 <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

请求参数说明

POST BODY:JSON格式的结构体

请求示例

 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":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>');
    echo $wording."</br>";
    var_dump($err);
    print_r('</pre>');
  }
}
/**
 * 请求型接口的基类
 */
class Wxpay_client_pub extends Common_util_pub
{
  var $parameters;//请求参数,类型为关联数组
  public $response;//微信返回的响应
  public $result;//返回参数,类型为关联数组
  var $url;//接口链接
  var $curl_timeout;//curl超时时间
  /**
   * 作用:设置请求参数
   */
  function setParameter($parameter, $parameterValue)
  {
    $this->parameters[$this->trimString($parameter)] = $this->trimString($parameterValue);
  }
  /**
   * 作用:设置标配的请求参数,生成签名,生成接口参数xml
   */
  function createXml()
  {
    $this->parameters["appid"] = WxPayConf_pub::APPID;//公众账号ID
    $this->parameters["mch_id"] = WxPayConf_pub::MCHID;//商户号
    $this->parameters["nonce_str"] = $this->createNoncestr();//随机字符串
    $this->parameters["sign"] = $this->getSign($this->parameters);//签名
    return $this->arrayToXml($this->parameters);
  }
  /**
   * 作用:post请求xml
   */
  function postXml()
  {
    $xml = $this->createXml();
    $this->response = $this->postXmlCurl($xml,$this->url,$this->curl_timeout);
    return $this->response;
  }
  /**
   * 作用:使用证书post请求xml
   */
  function postXmlSSL()
  {
    $xml = $this->createXml();
    $this->response = $this->postXmlSSLCurl($xml,$this->url,$this->curl_timeout);
    return $this->response;
  }
  /**
   * 作用:获取结果,默认不使用证书
   */
  function getResult()
  {
    $this->postXml();
    $this->result = $this->xmlToArray($this->response);
    return $this->result;
  }
}
/**
 * 统一支付接口类
 */
class UnifiedOrder_pub extends Wxpay_client_pub
{
  function __construct()
  {
    //设置接口链接
    $this->url = "https://api.mch.weixin.qq.com/pay/unifiedorder";
    //设置curl超时时间
    $this->curl_timeout = WxPayConf_pub::CURL_TIMEOUT;
  }
  /**
   * 生成接口参数xml
   */
  function createXml()
  {
    try
    {
      //检测必填参数
      if($this->parameters["out_trade_no"] == null)
      {
        throw new SDKRuntimeException("缺少统一支付接口必填参数out_trade_no!"."<br>");
      }elseif($this->parameters["body"] == null){
        throw new SDKRuntimeException("缺少统一支付接口必填参数body!"."<br>");
      }elseif ($this->parameters["total_fee"] == null ) {
        throw new SDKRuntimeException("缺少统一支付接口必填参数total_fee!"."<br>");
      }elseif ($this->parameters["notify_url"] == null) {
        throw new SDKRuntimeException("缺少统一支付接口必填参数notify_url!"."<br>");
      }elseif ($this->parameters["trade_type"] == null) {
        throw new SDKRuntimeException("缺少统一支付接口必填参数trade_type!"."<br>");
      }elseif ($this->parameters["trade_type"] == "JSAPI" &&
        $this->parameters["openid"] == NULL){
        throw new SDKRuntimeException("统一支付接口中,缺少必填参数openid!trade_type为JSAPI时,openid为必填参数!"."<br>");
      }
      $this->parameters["appid"] = WxPayConf_pub::APPID;//公众账号ID
      $this->parameters["mch_id"] = WxPayConf_pub::MCHID;//商户号
      $this->parameters["spbill_create_ip"] = $_SERVER['REMOTE_ADDR'];//终端ip
      $this->parameters["nonce_str"] = $this->createNoncestr();//随机字符串
      $this->parameters["sign"] = $this->getSign($this->parameters);//签名
      return $this->arrayToXml($this->parameters);
    }catch (SDKRuntimeException $e)
    {
      die($e->errorMessage());
    }
  }
  /**
   * 获取prepay_id
   */
  function getPrepayId()
  {
    $this->postXml();
    $this->result = $this->xmlToArray($this->response);
    $prepay_id = $this->result["prepay_id"];
    return $prepay_id;
  }
}
/**
 * 订单查询接口
 */
class OrderQuery_pub extends Wxpay_client_pub
{
  function __construct()
  {
    //设置接口链接
    $this->url = "https://api.mch.weixin.qq.com/pay/orderquery";
    //设置curl超时时间
    $this->curl_timeout = WxPayConf_pub::CURL_TIMEOUT;
  }
  /**
   * 生成接口参数xml
   */
  function createXml()
  {
    try
    {
      //检测必填参数
      if($this->parameters["out_trade_no"] == null &&
        $this->parameters["transaction_id"] == null)
      {
        throw new SDKRuntimeException("订单查询接口中,out_trade_no、transaction_id至少填一个!"."<br>");
      }
      $this->parameters["appid"] = WxPayConf_pub::APPID;//公众账号ID
      $this->parameters["mch_id"] = WxPayConf_pub::MCHID;//商户号
      $this->parameters["nonce_str"] = $this->createNoncestr();//随机字符串
      $this->parameters["sign"] = $this->getSign($this->parameters);//签名
      return $this->arrayToXml($this->parameters);
    }catch (SDKRuntimeException $e)
    {
      die($e->errorMessage());
    }
  }
}
/**
 * 退款申请接口
 */
class Refund_pub extends Wxpay_client_pub
{
  function __construct() {
    //设置接口链接
    $this->url = "https://api.mch.weixin.qq.com/secapi/pay/refund";
    //设置curl超时时间
    $this->curl_timeout = WxPayConf_pub::CURL_TIMEOUT;
  }
  /**
   * 生成接口参数xml
   */
  function createXml()
  {
    try
    {
      //检测必填参数
      if($this->parameters["out_trade_no"] == null && $this->parameters["transaction_id"] == null) {
        throw new SDKRuntimeException("退款申请接口中,out_trade_no、transaction_id至少填一个!"."<br>");
      }elseif($this->parameters["out_refund_no"] == null){
        throw new SDKRuntimeException("退款申请接口中,缺少必填参数out_refund_no!"."<br>");
      }elseif($this->parameters["total_fee"] == null){
        throw new SDKRuntimeException("退款申请接口中,缺少必填参数total_fee!"."<br>");
      }elseif($this->parameters["refund_fee"] == null){
        throw new SDKRuntimeException("退款申请接口中,缺少必填参数refund_fee!"."<br>");
      }elseif($this->parameters["op_user_id"] == null){
        throw new SDKRuntimeException("退款申请接口中,缺少必填参数op_user_id!"."<br>");
      }
      $this->parameters["appid"] = WxPayConf_pub::APPID;//公众账号ID
      $this->parameters["mch_id"] = WxPayConf_pub::MCHID;//商户号
      $this->parameters["nonce_str"] = $this->createNoncestr();//随机字符串
      $this->parameters["sign"] = $this->getSign($this->parameters);//签名
      return $this->arrayToXml($this->parameters);
    }catch (SDKRuntimeException $e)
    {
      die($e->errorMessage());
    }
  }
  /**
   * 作用:获取结果,使用证书通信
   */
  function getResult()
  {
    $this->postXmlSSL();
    $this->result = $this->xmlToArray($this->response);
    return $this->result;
  }
}
/**
 * 退款查询接口
 */
class RefundQuery_pub extends Wxpay_client_pub
{
  function __construct() {
    //设置接口链接
    $this->url = "https://api.mch.weixin.qq.com/pay/refundquery";
    //设置curl超时时间
    $this->curl_timeout = WxPayConf_pub::CURL_TIMEOUT;
  }
  /**
   * 生成接口参数xml
   */
  function createXml()
  {
    try
    {
      if($this->parameters["out_refund_no"] == null &&
        $this->parameters["out_trade_no"] == null &&
        $this->parameters["transaction_id"] == null &&
        $this->parameters["refund_id "] == null)
      {
        throw new SDKRuntimeException("退款查询接口中,out_refund_no、out_trade_no、transaction_id、refund_id四个参数必填一个!"."<br>");
      }
      $this->parameters["appid"] = WxPayConf_pub::APPID;//公众账号ID
      $this->parameters["mch_id"] = WxPayConf_pub::MCHID;//商户号
      $this->parameters["nonce_str"] = $this->createNoncestr();//随机字符串
      $this->parameters["sign"] = $this->getSign($this->parameters);//签名
      return $this->arrayToXml($this->parameters);
    }catch (SDKRuntimeException $e)
    {
      die($e->errorMessage());
    }
  }
  /**
   * 作用:获取结果,使用证书通信
   */
  function getResult()
  {
    $this->postXmlSSL();
    $this->result = $this->xmlToArray($this->response);
    return $this->result;
  }
}
/**
 * 对账单接口
 */
class DownloadBill_pub extends Wxpay_client_pub
{
  function __construct()
  {
    //设置接口链接
    $this->url = "https://api.mch.weixin.qq.com/pay/downloadbill";
    //设置curl超时时间
    $this->curl_timeout = WxPayConf_pub::CURL_TIMEOUT;
  }
  /**
   * 生成接口参数xml
   */
  function createXml()
  {
    try
    {
      if($this->parameters["bill_date"] == null )
      {
        throw new SDKRuntimeException("对账单接口中,缺少必填参数bill_date!"."<br>");
      }
      $this->parameters["appid"] = WxPayConf_pub::APPID;//公众账号ID
      $this->parameters["mch_id"] = WxPayConf_pub::MCHID;//商户号
      $this->parameters["nonce_str"] = $this->createNoncestr();//随机字符串
      $this->parameters["sign"] = $this->getSign($this->parameters);//签名
      return $this->arrayToXml($this->parameters);
    }catch (SDKRuntimeException $e)
    {
      die($e->errorMessage());
    }
  }
  /**
   * 作用:获取结果,默认不使用证书
   */
  function getResult()
  {
    $this->postXml();
    $this->result = $this->xmlToArray($this->result_xml);
    return $this->result;
  }
}
/**
 * 短链接转换接口
 */
class ShortUrl_pub extends Wxpay_client_pub
{
  function __construct()
  {
    //设置接口链接
    $this->url = "https://api.mch.weixin.qq.com/tools/shorturl";
    //设置curl超时时间
    $this->curl_timeout = WxPayConf_pub::CURL_TIMEOUT;
  }
  /**
   * 生成接口参数xml
   */
  function createXml()
  {
    try
    {
      if($this->parameters["long_url"] == null )
      {
        throw new SDKRuntimeException("短链接转换接口中,缺少必填参数long_url!"."<br>");
      }
      $this->parameters["appid"] = WxPayConf_pub::APPID;//公众账号ID
      $this->parameters["mch_id"] = WxPayConf_pub::MCHID;//商户号
      $this->parameters["nonce_str"] = $this->createNoncestr();//随机字符串
      $this->parameters["sign"] = $this->getSign($this->parameters);//签名
      return $this->arrayToXml($this->parameters);
    }catch (SDKRuntimeException $e)
    {
      die($e->errorMessage());
    }
  }
  /**
   * 获取prepay_id
   */
  function getShortUrl()
  {
    $this->postXml();
    $prepay_id = $this->result["short_url"];
    return $prepay_id;
  }
}
/**
 * 响应型接口基类
 */
class Wxpay_server_pub extends Common_util_pub
{
  public $data;//接收到的数据,类型为关联数组
  var $returnParameters;//返回参数,类型为关联数组
  /**
   * 将微信的请求xml转换成关联数组,以方便数据处理
   */
  function saveData($xml)
  {
    $this->data = $this->xmlToArray($xml);
  }
  function checkSign()
  {
    $tmpData = $this->data;
    unset($tmpData['sign']);
    $sign = $this->getSign($tmpData);//本地签名
    if ($this->data['sign'] == $sign) {
      return TRUE;
    }
    return FALSE;
  }
  /**
   * 获取微信的请求数据
   */
  function getData()
  {
    return $this->data;
  }
  /**
   * 设置返回微信的xml数据
   */
  function setReturnParameter($parameter, $parameterValue)
  {
    $this->returnParameters[$this->trimString($parameter)] = $this->trimString($parameterValue);
  }
  /**
   * 生成接口参数xml
   */
  function createXml()
  {
    return $this->arrayToXml($this->returnParameters);
  }
  /**
   * 将xml数据返回微信
   */
  function returnXml()
  {
    $returnXml = $this->createXml();
    return $returnXml;
  }
}
/**
 * 通用通知接口
 */
class Notify_pub extends Wxpay_server_pub
{
}
/**
 * 请求商家获取商品信息接口
 */
class NativeCall_pub extends Wxpay_server_pub
{
  /**
   * 生成接口参数xml
   */
  function createXml()
  {
    if($this->returnParameters["return_code"] == "SUCCESS"){
      $this->returnParameters["appid"] = WxPayConf_pub::APPID;//公众账号ID
      $this->returnParameters["mch_id"] = WxPayConf_pub::MCHID;//商户号
      $this->returnParameters["nonce_str"] = $this->createNoncestr();//随机字符串
      $this->returnParameters["sign"] = $this->getSign($this->returnParameters);//签名
    }
    return $this->arrayToXml($this->returnParameters);
  }
  /**
   * 获取product_id
   */
  function getProductId()
  {
    $product_id = $this->data["product_id"];
    return $product_id;
  }
}
/**
 * 静态链接二维码
 */
class NativeLink_pub extends Common_util_pub
{
  var $parameters;//静态链接参数
  var $url;//静态链接
  function __construct()
  {
  }
  /**
   * 设置参数
   */
  function setParameter($parameter, $parameterValue)
  {
    $this->parameters[$this->trimString($parameter)] = $this->trimString($parameterValue);
  }
  /**
   * 生成Native支付链接二维码
   */
  function createLink()
  {
    try
    {
      if($this->parameters["product_id"] == null)
      {
        throw new SDKRuntimeException("缺少Native支付二维码链接必填参数product_id!"."<br>");
      }
      $this->parameters["appid"] = WxPayConf_pub::APPID;//公众账号ID
      $this->parameters["mch_id"] = WxPayConf_pub::MCHID;//商户号
      $time_stamp = time();
      $this->parameters["time_stamp"] = "$time_stamp";//时间戳
      $this->parameters["nonce_str"] = $this->createNoncestr();//随机字符串
      $this->parameters["sign"] = $this->getSign($this->parameters);//签名
      $bizString = $this->formatBizQueryParaMap($this->parameters, false);
      $this->url = "weixin://wxpay/bizpayurl?".$bizString;
    }catch (SDKRuntimeException $e)
    {
      die($e->errorMessage());
    }
  }
  /**
   * 返回链接
   */
  function getUrl()
  {
    $this->createLink();
    return $this->url;
  }
}
/**
* JSAPI支付——H5网页端调起支付接口
*/
class JsApi_pub extends Common_util_pub
{
  var $code;//code码,用以获取openid
  var $openid;//用户的openid
  var $parameters;//jsapi参数,格式为json
  var $prepay_id;//使用统一支付接口得到的预支付id
  var $curl_timeout;//curl超时时间
  function __construct()
  {
    //设置curl超时时间
    $this->curl_timeout = WxPayConf_pub::CURL_TIMEOUT;
  }
  /**
   * 作用:生成可以获得code的url
   */
  function createOauthUrlForCode($redirectUrl)
  {
    $urlObj["appid"] = WxPayConf_pub::APPID;
    $urlObj["redirect_uri"] = "$redirectUrl";
    $urlObj["response_type"] = "code";
    $urlObj["scope"] = "snsapi_base";
    $urlObj["state"] = "STATE"."#wechat_redirect";
    $bizString = $this->formatBizQueryParaMap($urlObj, false);
    return "https://open.weixin.qq.com/connect/oauth2/authorize?".$bizString;
  }
  /**
   * 作用:生成可以获得openid的url
   */
  function createOauthUrlForOpenid()
  {
    $urlObj["appid"] = WxPayConf_pub::APPID;
    $urlObj["secret"] = WxPayConf_pub::APPSECRET;
    $urlObj["code"] = $this->code;
    $urlObj["grant_type"] = "authorization_code";
    $bizString = $this->formatBizQueryParaMap($urlObj, false);
    return "https://api.weixin.qq.com/sns/oauth2/access_token?".$bizString;
  }
  /**
   * 作用:通过curl向微信提交code,以获取openid
   */
  function getOpenid()
  {
    $url = $this->createOauthUrlForOpenid();
    //初始化curl
    $ch = curl_init();
    //设置超时
    curl_setopt($ch, CURLOP_TIMEOUT, $this->curl_timeout);
    curl_setopt($ch, CURLOPT_URL, $url);
    curl_setopt($ch,CURLOPT_SSL_VERIFYPEER,FALSE);
    curl_setopt($ch,CURLOPT_SSL_VERIFYHOST,FALSE);
    curl_setopt($ch, CURLOPT_HEADER, FALSE);
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, TRUE);
    //运行curl,结果以jason形式返回
    $res = curl_exec($ch);
    curl_close($ch);
    //取出openid
    $data = json_decode($res,true);
    $this->openid = $data['openid'];
    return $this->openid;
  }
  /**
   * 作用:设置prepay_id
   */
  function setPrepayId($prepayId)
  {
    $this->prepay_id = $prepayId;
  }
  /**
   * 作用:设置code
   */
  function setCode($code_)
  {
    $this->code = $code_;
  }
  /**
   * 作用:设置jsapi的参数
   */
  public function getParameters()
  {
    $jsApiObj["appId"] = WxPayConf_pub::APPID;
    $timeStamp = time();
    $jsApiObj["timeStamp"] = "$timeStamp";
    $jsApiObj["nonceStr"] = $this->createNoncestr();
    $jsApiObj["package"] = "prepay_id=$this->prepay_id";
    $jsApiObj["signType"] = "MD5";
    $jsApiObj["paySign"] = $this->getSign($jsApiObj);
    $this->parameters = json_encode($jsApiObj);
    return $this->parameters;
  }
}
/**
 * 现金红包接口
 * @author gaoyl101
 */
class Redpack_pub extends Wxpay_client_pub
{
  var $code;//code码,用以获取openid
  var $openid;//用户的openid
  function __construct()
  {
    //设置接口链接
    $this->url = "https://api.mch.weixin.qq.com/mmpaymkttransfers/sendredpack";
    //设置curl超时时间
    $this->curl_timeout = WxPayConf_pub::CURL_TIMEOUT;
  }
  /**
   * 生成接口参数xml
   */
  function createXml()
  {
    try
    {
      //检测必填参数
      if($this->parameters["mch_billno"] == null)
      {
        throw new SDKRuntimeException("缺少发红包接口必填参数mch_billno!"."<br>");
      }elseif($this->parameters["nick_name"] == null){
        throw new SDKRuntimeException("缺少发红包接口必填参数nick_name!"."<br>");
      }elseif ($this->parameters["send_name"] == null ) {
        throw new SDKRuntimeException("缺少发红包接口必填参数send_name!"."<br>");
      }elseif ($this->parameters["total_amount"] == null) {
        throw new SDKRuntimeException("缺少发红包接口必填参数total_amount!"."<br>");
      }elseif($this->parameters["min_value"] == null){
        throw new SDKRuntimeException("缺少发红包接口必填参数min_value!"."<br>");
      }elseif ($this->parameters["max_value"] == null ) {
        throw new SDKRuntimeException("缺少发红包接口必填参数max_value!"."<br>");
      }elseif ($this->parameters["total_num"] == null) {
        throw new SDKRuntimeException("缺少发红包接口必填参数total_num!"."<br>");
      }elseif ($this->parameters["wishing"] == null) {
        throw new SDKRuntimeException("缺少发红包接口必填参数wishing!"."<br>");
      }elseif ($this->parameters["act_name"] == null) {
        throw new SDKRuntimeException("缺少发红包接口必填参数act_name!"."<br>");
      }elseif ($this->parameters["remark"] == null) {
        throw new SDKRuntimeException("缺少发红包接口必填参数remark!"."<br>");
      }
      $this->parameters["wxappid"] = WxPayConf_pub::APPID;//公众账号ID
      $this->parameters["mch_id"] = WxPayConf_pub::MCHID;//商户号
      $this->parameters["client_ip"] = $_SERVER['REMOTE_ADDR'];//终端ip
      $this->parameters["nonce_str"] = $this->createNoncestr();//随机字符串
      $this->parameters["re_openid"] = $this->parameters["re_openid"];
      //$this->openid;//用户openid
      $this->parameters["sign"] = $this->getSign($this->parameters);//签名
      return $this->arrayToXml($this->parameters);
    }catch (SDKRuntimeException $e)
    {
      die($e->errorMessage());
    }
  }
  function sendRedpack()
  {
    $this->postXmlSSL();
    $this->result = $this->xmlToArray($this->response);
    return $this->result;
  }
  /**
   * 作用:生成可以获得code的url
   */
  function createOauthUrlForCode($redirectUrl)
  {
    $urlObj["appid"] = WxPayConf_pub::APPID;
    $urlObj["redirect_uri"] = "$redirectUrl";
    $urlObj["response_type"] = "code";
    $urlObj["scope"] = "snsapi_base";
    $urlObj["state"] = "STATE"."#wechat_redirect";
    $bizString = $this->formatBizQueryParaMap($urlObj, false);
    return "https://open.weixin.qq.com/connect/oauth2/authorize?".$bizString;
  }
  /**
   * 作用:生成可以获得openid的url
   */
  function createOauthUrlForOpenid()
  {
    $urlObj["appid"] = WxPayConf_pub::APPID;
    $urlObj["secret"] = WxPayConf_pub::APPSECRET;
    $urlObj["code"] = $this->code;
    $urlObj["grant_type"] = "authorization_code";
    $bizString = $this->formatBizQueryParaMap($urlObj, false);
    return "https://api.weixin.qq.com/sns/oauth2/access_token?".$bizString;
  }
  /**
   * 作用:通过curl向微信提交code,以获取openid
   */
  function getOpenid()
  {
    $url = $this->createOauthUrlForOpenid();
    //初始化curl
    $ch = curl_init();
    //设置超时
    curl_setopt($ch, CURLOP_TIMEOUT, $this->curl_timeout);
    curl_setopt($ch, CURLOPT_URL, $url);
    curl_setopt($ch,CURLOPT_SSL_VERIFYPEER,FALSE);
    curl_setopt($ch,CURLOPT_SSL_VERIFYHOST,FALSE);
    curl_setopt($ch, CURLOPT_HEADER, FALSE);
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, TRUE);
    //运行curl,结果以jason形式返回
    $res = curl_exec($ch);
    curl_close($ch);
    //取出openid
    $data = json_decode($res,true);
    $this->openid = $data['openid'];
    return $this->openid;
  }
  /**
   * 作用:设置code
   */
  function setCode($code_)
  {
    $this->code = $code_;
  }
}
/**
 * 红包支付接口
 * @author gaoyl101
 */
class Groupredpack_pub extends Wxpay_client_pub
{
  var $code;//code码,用以获取openid
  var $openid;//用户的openid
  function __construct()
  {
    //设置接口链接
    $this->url = "https://api.mch.weixin.qq.com/mmpaymkttransfers/sendgroupredpack";
    //设置curl超时时间
    $this->curl_timeout = WxPayConf_pub::CURL_TIMEOUT;
  }
  /**
   * 生成接口参数xml
   */
  function createXml()
  {
    try
    {
      //检测必填参数
      if($this->parameters["mch_billno"] == null)
      {
        throw new SDKRuntimeException("缺少发红包接口必填参数mch_billno!"."<br>");
      }elseif ($this->parameters["send_name"] == null ) {
        throw new SDKRuntimeException("缺少发红包接口必填参数send_name!"."<br>");
      }elseif ($this->parameters["total_amount"] == null) {
        throw new SDKRuntimeException("缺少发红包接口必填参数total_amount!"."<br>");
      }elseif ($this->parameters["total_num"] == null) {
        throw new SDKRuntimeException("缺少发红包接口必填参数total_num!"."<br>");
      }elseif ($this->parameters["amt_type"] == null) {
        throw new SDKRuntimeException("缺少发红包接口必填参数amt_type!"."<br>");
      }elseif ($this->parameters["wishing"] == null) {
        throw new SDKRuntimeException("缺少发红包接口必填参数wishing!"."<br>");
      }elseif ($this->parameters["act_name"] == null) {
        throw new SDKRuntimeException("缺少发红包接口必填参数act_name!"."<br>");
      }elseif ($this->parameters["remark"] == null) {
        throw new SDKRuntimeException("缺少发红包接口必填参数remark!"."<br>");
      }
      $this->parameters["wxappid"] = WxPayConf_pub::APPID;//公众账号ID
      $this->parameters["mch_id"] = WxPayConf_pub::MCHID;//商户号
      $this->parameters["nonce_str"] = $this->createNoncestr();//随机字符串
      $this->parameters["re_openid"] = $this->openid;//用户openid
      $this->parameters["sign"] = $this->getSign($this->parameters);//签名
      return $this->arrayToXml($this->parameters);
    }catch (SDKRuntimeException $e)
    {
      die($e->errorMessage());
    }
  }
  function sendRedpack()
  {
    $this->postXmlSSL();
    $this->result = $this->xmlToArray($this->response);
    return $this->result;
  }
  /**
   * 作用:生成可以获得code的url
   */
  function createOauthUrlForCode($redirectUrl)
  {
    $urlObj["appid"] = WxPayConf_pub::APPID;
    $urlObj["redirect_uri"] = "$redirectUrl";
    $urlObj["response_type"] = "code";
    $urlObj["scope"] = "snsapi_base";
    $urlObj["state"] = "STATE"."#wechat_redirect";
    $bizString = $this->formatBizQueryParaMap($urlObj, false);
    return "https://open.weixin.qq.com/connect/oauth2/authorize?".$bizString;
  }
  /**
   * 作用:生成可以获得openid的url
   */
  function createOauthUrlForOpenid()
  {
    $urlObj["appid"] = WxPayConf_pub::APPID;
    $urlObj["secret"] = WxPayConf_pub::APPSECRET;
    $urlObj["code"] = $this->code;
    $urlObj["grant_type"] = "authorization_code";
    $bizString = $this->formatBizQueryParaMap($urlObj, false);
    return "https://api.weixin.qq.com/sns/oauth2/access_token?".$bizString;
  }
  /**
   * 作用:通过curl向微信提交code,以获取openid
   */
  function getOpenid()
  {
    $url = $this->createOauthUrlForOpenid();
    //初始化curl
    $ch = curl_init();
    //设置超时
    curl_setopt($ch, CURLOP_TIMEOUT, $this->curl_timeout);
    curl_setopt($ch, CURLOPT_URL, $url);
    curl_setopt($ch,CURLOPT_SSL_VERIFYPEER,FALSE);
    curl_setopt($ch,CURLOPT_SSL_VERIFYHOST,FALSE);
    curl_setopt($ch, CURLOPT_HEADER, FALSE);
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, TRUE);
    //运行curl,结果以jason形式返回
    $res = curl_exec($ch);
    curl_close($ch);
    //取出openid
    $data = json_decode($res,true);
    $this->openid = $data['openid'];
    return $this->openid;
  }
  /**
   * 作用:设置code
   */
  function setCode($code_)
  {
    $this->code = $code_;
  }
}
/**
 * 摇一摇红包预下单
 * @author jiosen
 */
class Yhb_pub extends Wxpay_client_pub
{
  var $code;//code码,用以获取openid
  var $openid;//用户的openid
  function __construct()
  {
    //设置接口链接
    $this->url = "https://api.mch.weixin.qq.com/mmpaymkttransfers/hbpreorder";
    //设置curl超时时间
    $this->curl_timeout = WxPayConf_pub::CURL_TIMEOUT;
  }
  /**
   * 生成接口参数xml
   */
  function createXml()
  {
    try
    {
      //检测必填参数
      if($this->parameters["mch_billno"] == null)
      {
        throw new SDKRuntimeException("缺少发红包接口必填参数mch_billno!"."<br>");
      }elseif ($this->parameters["send_name"] == null ) {
        throw new SDKRuntimeException("缺少发红包接口必填参数send_name!"."<br>");
      }elseif ($this->parameters["total_amount"] == null) {
        throw new SDKRuntimeException("缺少发红包接口必填参数total_amount!"."<br>");
      }elseif ($this->parameters["total_num"] == null) {
        throw new SDKRuntimeException("缺少发红包接口必填参数total_num!"."<br>");
      }elseif ($this->parameters["wishing"] == null) {
        throw new SDKRuntimeException("缺少发红包接口必填参数wishing!"."<br>");
      }elseif ($this->parameters["act_name"] == null) {
        throw new SDKRuntimeException("缺少发红包接口必填参数act_name!"."<br>");
      }elseif ($this->parameters["remark"] == null) {
        throw new SDKRuntimeException("缺少发红包接口必填参数remark!"."<br>");
      }
      $this->parameters["wxappid"] = WxPayConf_pub::APPID;//公众账号ID
      $this->parameters["mch_id"] = WxPayConf_pub::MCHID;//商户号
      $this->parameters["nonce_str"] = $this->createNoncestr();//随机字符串
      //$this->parameters["re_openid"] = $this->openid;//用户openid
      $this->parameters["hb_type"] = 'NORMAL';//红包类型 NORMAL-普通红包;GROUP-裂变红包(可分享红包给好友,无关注公众号能力)。
      $this->parameters["auth_mchid"] = '1000052601';//摇周边商户号
      $this->parameters["auth_appid"] = 'wxbf42bd79c4391863';//摇周边 appid
      $this->parameters["risk_cntl"] = 'NORMAL';//风控设置
      $this->parameters["sign"] = $this->getSign($this->parameters);//签名
      //echo json_encode($this->parameters);die;
      return $this->arrayToXml($this->parameters);
      //echo $this->parameters["auth_appid"].'--'.$this->parameters["auth_mchid"];die;
    }catch (SDKRuntimeException $e)
    {
      die($e->errorMessage());
    }
  }
  function hbpreorder()
  {
    $this->postXmlSSL();
    $this->result = $this->xmlToArray($this->response);
    return $this->result;
  }
  /**
   * 作用:生成可以获得code的url
   */
  function createOauthUrlForCode($redirectUrl)
  {
    $urlObj["appid"] = WxPayConf_pub::APPID;
    $urlObj["redirect_uri"] = "$redirectUrl";
    $urlObj["response_type"] = "code";
    $urlObj["scope"] = "snsapi_base";
    $urlObj["state"] = "STATE"."#wechat_redirect";
    $bizString = $this->formatBizQueryParaMap($urlObj, false);
    return "https://open.weixin.qq.com/connect/oauth2/authorize?".$bizString;
  }
  /**
   * 作用:生成可以获得openid的url
   */
  function createOauthUrlForOpenid()
  {
    $urlObj["appid"] = WxPayConf_pub::APPID;
    $urlObj["secret"] = WxPayConf_pub::APPSECRET;
    $urlObj["code"] = $this->code;
    $urlObj["grant_type"] = "authorization_code";
    $bizString = $this->formatBizQueryParaMap($urlObj, false);
    return "https://api.weixin.qq.com/sns/oauth2/access_token?".$bizString;
  }
  /**
   * 作用:通过curl向微信提交code,以获取openid
   */
  function getOpenid()
  {
    $url = $this->createOauthUrlForOpenid();
    //初始化curl
    $ch = curl_init();
    //设置超时
    curl_setopt($ch, CURLOP_TIMEOUT, $this->curl_timeout);
    curl_setopt($ch, CURLOPT_URL, $url);
    curl_setopt($ch,CURLOPT_SSL_VERIFYPEER,FALSE);
    curl_setopt($ch,CURLOPT_SSL_VERIFYHOST,FALSE);
    curl_setopt($ch, CURLOPT_HEADER, FALSE);
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, TRUE);
    //运行curl,结果以jason形式返回
    $res = curl_exec($ch);
    curl_close($ch);
    //取出openid
    $data = json_decode($res,true);
    $this->openid = $data['openid'];
    return $this->openid;
  }
  /**
   * 作用:设置code
   */
  function setCode($code_)
  {
    $this->code = $code_;
  }
}
/**
 * 摇一摇红包 创建活动
 * @author jiosen
 */
class addlotteryinfo_pub extends Wxpay_client_pub
{
  var $code;//code码,用以获取openid
  var $openid;//用户的openid
  function __construct($access_token,$logo)
  {
    //设置接口链接
    $this->url = "https://api.weixin.qq.com/shakearound/lottery/addlotteryinfo?access_token=".$access_token."&use_template=1&logo_url=".$logo;
    //设置curl超时时间
    $this->curl_timeout = WxPayConf_pub::CURL_TIMEOUT;
  }
  /**
   * 生成接口参数 json
   */
  function createJson()
  {
    try
    {
      //检测必填参数
      if($this->parameters["title"] == null)
      {
        throw new SDKRuntimeException("缺少抽奖活动名称title!"."<br>");
      }elseif ($this->parameters["desc"] == null ) {
        throw new SDKRuntimeException("缺少抽奖活动描述desc!"."<br>");
      }elseif ($this->parameters["begin_time"] == null) {
        throw new SDKRuntimeException("缺少活动开始时间 begin_time!"."<br>");
      }elseif ($this->parameters["expire_time"] == null) {
        throw new SDKRuntimeException("缺少活动结束时间 expire_time!"."<br>");
      }elseif ($this->parameters["total"] == null) {
        throw new SDKRuntimeException("缺少红包总数total!"."<br>");
      }elseif ($this->parameters["jump_url"] == null) {
        throw new SDKRuntimeException("缺少红包关注跳转连接jump_url!"."<br>");
      }elseif ($this->parameters["key"] == null) {
        throw new SDKRuntimeException("缺少红包key!"."<br>");
      }
      $this->parameters["title"] = urlencode($this->parameters["title"]);
      $this->parameters["desc"] = urlencode($this->parameters["desc"]);
      $this->parameters["onoff"] = '0';//开启活动
      $this->parameters["sponsor_appid"] = WxPayConf_pub::APPID;//公众账号ID
      //var_dump($this->parameters);
      //echo json_encode($this->parameters);
      return json_encode($this->parameters);
    }catch (SDKRuntimeException $e)
    {
      die($e->errorMessage());
    }
  }
  function hbpreorder()
  {
    $data = $this->createJson();
    $result = $this->curl_post($this->url,urldecode($data));
    $result = json_decode($result);
    return $result;
  }
  function curl_post($url,$data)
  {
    $curl = curl_init($url);
    curl_setopt($curl, CURLOPT_CONNECTTIMEOUT, 30);
    curl_setopt($curl, CURLOPT_TIMEOUT, 10);
    curl_setopt($curl, CURLOPT_RETURNTRANSFER, TRUE);
    curl_setopt($curl, CURLOPT_SSL_VERIFYPEER, false);
    curl_setopt($curl, CURLOPT_POST, 1);//发送一个常规的Post请求
    curl_setopt($curl, CURLOPT_POSTFIELDS, $data);//Post提交的数据包
    $rv = curl_exec($curl);//输出内容
    curl_close($curl);
    return $rv;
  }
  /**
   * 作用:生成可以获得code的url
   */
  function createOauthUrlForCode($redirectUrl)
  {
    $urlObj["appid"] = WxPayConf_pub::APPID;
    $urlObj["redirect_uri"] = "$redirectUrl";
    $urlObj["response_type"] = "code";
    $urlObj["scope"] = "snsapi_base";
    $urlObj["state"] = "STATE"."#wechat_redirect";
    $bizString = $this->formatBizQueryParaMap($urlObj, false);
    return "https://open.weixin.qq.com/connect/oauth2/authorize?".$bizString;
  }
  /**
   * 作用:生成可以获得openid的url
   */
  function createOauthUrlForOpenid()
  {
    $urlObj["appid"] = WxPayConf_pub::APPID;
    $urlObj["secret"] = WxPayConf_pub::APPSECRET;
    $urlObj["code"] = $this->code;
    $urlObj["grant_type"] = "authorization_code";
    $bizString = $this->formatBizQueryParaMap($urlObj, false);
    return "https://api.weixin.qq.com/sns/oauth2/access_token?".$bizString;
  }
  /**
   * 作用:通过curl向微信提交code,以获取openid
   */
  function getOpenid()
  {
    $url = $this->createOauthUrlForOpenid();
    //初始化curl
    $ch = curl_init();
    //设置超时
    curl_setopt($ch, CURLOP_TIMEOUT, $this->curl_timeout);
    curl_setopt($ch, CURLOPT_URL, $url);
    curl_setopt($ch,CURLOPT_SSL_VERIFYPEER,FALSE);
    curl_setopt($ch,CURLOPT_SSL_VERIFYHOST,FALSE);
    curl_setopt($ch, CURLOPT_HEADER, FALSE);
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, TRUE);
    //运行curl,结果以jason形式返回
    $res = curl_exec($ch);
    curl_close($ch);
    //取出openid
    $data = json_decode($res,true);
    $this->openid = $data['openid'];
    return $this->openid;
  }
  /**
   * 作用:设置code
   */
  function setCode($code_)
  {
    $this->code = $code_;
  }
}
/**
 * 摇一摇红包 录入红包
 * @author jiosen
 */
class lottery_pub extends Wxpay_client_pub
{
  var $code;//code码,用以获取openid
  var $openid;//用户的openid
  function __construct($access_token)
  {
    //设置接口链接
    $this->url = "https://api.weixin.qq.com/shakearound/lottery/setprizebucket?access_token=".$access_token;
    //设置curl超时时间
    $this->curl_timeout = WxPayConf_pub::CURL_TIMEOUT;
  }
  /**
   * 生成接口参数 json
   */
  function createJson()
  {
    try
    {
      //检测必填参数
      if($this->parameters["lottery_id"] == null)
      {
        throw new SDKRuntimeException("缺少抽奖活动id lottery_id !"."<br>");
      }else if(empty($this->parameters["prize_info_list"])){
        throw new SDKRuntimeException("缺少抽奖活动红包 prize_info_list !"."<br>");
      }
      $this->parameters["mchid"] = WxPayConf_pub::MCHID;//授权商户号
      $this->parameters["sponsor_appid"] = WxPayConf_pub::APPID;//授权上号appid
      return json_encode($this->parameters);
      //echo json_encode($this->parameters);die;
    }catch (SDKRuntimeException $e)
    {
      die($e->errorMessage());
    }
  }
  function setJsonArray($parameter, $parameterValue){
    $this->parameters[$this->trimString($parameter)] = $parameterValue;
  }
  function hbpreorder()
  {
    $data = $this->createJson();
    $result = $this->curl_post($this->url,$data);
    $result = json_decode($result);
    return $result;
  }
  function curl_post($url,$data)
  {
    $curl = curl_init($url);
    curl_setopt($curl, CURLOPT_CONNECTTIMEOUT, 30);
    curl_setopt($curl, CURLOPT_TIMEOUT, 10);
    curl_setopt($curl, CURLOPT_RETURNTRANSFER, TRUE);
    curl_setopt($curl, CURLOPT_SSL_VERIFYPEER, false);
    curl_setopt($curl, CURLOPT_POST, 1);//发送一个常规的Post请求
    curl_setopt($curl, CURLOPT_POSTFIELDS, $data);//Post提交的数据包
    $rv = curl_exec($curl);//输出内容
    curl_close($curl);
    return $rv;
  }
  /**
   * 作用:生成可以获得code的url
   */
  function createOauthUrlForCode($redirectUrl)
  {
    $urlObj["appid"] = WxPayConf_pub::APPID;
    $urlObj["redirect_uri"] = "$redirectUrl";
    $urlObj["response_type"] = "code";
    $urlObj["scope"] = "snsapi_base";
    $urlObj["state"] = "STATE"."#wechat_redirect";
    $bizString = $this->formatBizQueryParaMap($urlObj, false);
    return "https://open.weixin.qq.com/connect/oauth2/authorize?".$bizString;
  }
  /**
   * 作用:生成可以获得openid的url
   */
  function createOauthUrlForOpenid()
  {
    $urlObj["appid"] = WxPayConf_pub::APPID;
    $urlObj["secret"] = WxPayConf_pub::APPSECRET;
    $urlObj["code"] = $this->code;
    $urlObj["grant_type"] = "authorization_code";
    $bizString = $this->formatBizQueryParaMap($urlObj, false);
    return "https://api.weixin.qq.com/sns/oauth2/access_token?".$bizString;
  }
  /**
   * 作用:通过curl向微信提交code,以获取openid
   */
  function getOpenid()
  {
    $url = $this->createOauthUrlForOpenid();
    //初始化curl
    $ch = curl_init();
    //设置超时
    curl_setopt($ch, CURLOP_TIMEOUT, $this->curl_timeout);
    curl_setopt($ch, CURLOPT_URL, $url);
    curl_setopt($ch,CURLOPT_SSL_VERIFYPEER,FALSE);
    curl_setopt($ch,CURLOPT_SSL_VERIFYHOST,FALSE);
    curl_setopt($ch, CURLOPT_HEADER, FALSE);
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, TRUE);
    //运行curl,结果以jason形式返回
    $res = curl_exec($ch);
    curl_close($ch);
    //取出openid
    $data = json_decode($res,true);
    $this->openid = $data['openid'];
    return $this->openid;
  }
  /**
   * 作用:设置code
   */
  function setCode($code_)
  {
    $this->code = $code_;
  }
}
?> 

以上内容比较长,希望大家在阅读的使用有点耐心,本文写的还算不错嘀,自我感觉良好吧,呵呵。使用PHP实现微信摇一摇周边红包相关内容就先给大家介绍到这里,希望对大家有所帮助。

(0)

相关推荐

  • 微信小程序“摇一摇”的实例代码

    微信小程序并没有提供摇一摇API接口,但是提供了一个重力感应的API 「wx.onAccelerometerChange(CALLBACK)」,我们可以用这个方法来模拟微信摇一摇功能,代码如下: Page({ onShow: function () { wx.onAccelerometerChange(function (e) { console.log(e.x) console.log(e.y) console.log(e.z) if (e.x > 1 && e.y > 1)

  • php官方微信接口大全(微信支付、微信红包、微信摇一摇、微信小店)

    微信入口绑定,微信事件处理,微信API全部操作包含在这些文件中. 内容有:微信摇一摇接口/微信多客服接口/微信支付接口/微信红包接口/微信卡券接口/微信小店接口/JSAPI <?php class WxApi { const appId = ""; const appSecret = ""; const mchid = ""; //商户号 const privatekey = ""; //私钥 public $param

  • iOS仿微信摇一摇动画效果加震动音效实例

    众所周知, 微信中的摇一摇功能: 搜索人/歌曲/电视,同样在一些其他类APP中也有一个摇一摇签到, 摇一摇随机选号等功能,下面以微信摇一摇功能来介绍实现原理. 对于摇一摇功能, 在iOS中系统默认为我们提供了摇一摇的功能检测API. iOS 中既然已经提供了接口, 我们直接调用就好了. #import <QuartzCore/QuartzCore.h> #import <AudioToolbox/AudioToolbox.h> 实现原理 1. 监听摇一摇方法 // 摇一摇开始 -

  • android 类似微信的摇一摇功能实现思路及代码

    复制代码 代码如下: package com.eboy.testyaoyiyao; import java.text.SimpleDateFormat; import java.util.Date; import android.app.Activity; import android.hardware.Sensor; import android.hardware.SensorEvent; import android.hardware.SensorEventListener; import

  • Android利用传感器实现微信摇一摇功能

    本文实例为大家分享了Android微信摇一摇功能的实现方法,供大家参考,具体内容如下 import java.util.ArrayList; import java.util.List; import java.util.Random; import android.app.Activity; import android.app.Service; import android.content.res.Resources; import android.hardware.Sensor; impo

  • 微信公众号 摇一摇周边功能开发

    ①申请开通摇一摇功能 申请开通摇一摇周边功能.成功提交申请请求后,工作人员会在三个工作日内完成审核.若审核不通过,可以重新提交申请请求.若是审核中,请耐心等待工作人员审核,在审核中状态不能再提交申请请求. 接口代码如下: http请求方式: POST(请使用https协议)https://api.weixin.qq.com/shakearound/account/register?access_token=ACCESS_TOKENPOST数据格式:json POST数据例子: { "name&q

  • 微信小程序 摇一摇抽奖简单实例实现代码

    微信小程序 摇一摇抽奖 微信小程序目录 为了更好的理解小程序和小程序开发,我们首先来看一下项目的目录. 首先看下根目录下的app.json的文件,可以看到在"pages"的数组里,里面配置了每个界面,且包含了每个界面文件的目录 我们接下来看一下page文件夹,可以看到每个页面需要包含两个文件,一个是js文件,是每个界面的入口,wxml的文件是每个界面的布局文件,wxss是样式文件. 接下来看一下logs文件夹,在logs文件夹中比index文件夹中多出了一个logs.json的文件,l

  • 使用PHP实现微信摇一摇周边红包

    最近接了个项目,其中有需求是要实现摇一摇红包功能,在网上搜了好久,都没有找到源码,没办法,只有自动写了,下面小编把我的劳动成果分享给大家供大家参考,本文写的不好,还请各位大侠提出宝贵意见,共同学习进步. 微信官方说明如下 摇一摇红包说明 功能说明 摇一摇周边红包接口是为线下商户提供的发红包功能.用户可以在商家门店等线下场所通过摇一摇周边领取商家发放的红包,在线上转发分享无效. 开发者可通过接口开发摇一摇红包功能,特点包括:  1.可选择使用模板加载页或自定义Html5页面调起微信原生红包页面(详

  • Android利用传感器仿微信摇一摇功能

    传感器 简单的介绍一下传感器: 就是设备用来感知周边环境变化的硬件. Android中的传感器包含在传感器框架中,属于android.hardware.*(硬件部分) 传感器框架主要包含四个部分: ① SensorManager:用来获取传感器的入口,它是一个系统的服务,还可以为传感器注册与取消注册监听 ② Sensor: 具体的传感器,包含了传感器的名字,类型,采样率 ③ SensorEvent:传感器事件,包含了传感器采集回来的数据,传感器的精度 ④ SensorEventListener:

  • JavaScript+H5实现微信摇一摇功能

    项目终于如约上线,但是在春节前又有一个新的活动要做,类似微信的摇一摇活动.也一直在做微信公众号的东西,但是要调用微信摇一摇的接口还是有些困难,因为只提供了摇一摇周边,附近的人以及一系列的红包页面,相对于我们的需求只需要摇一摇这个动作却是大相径庭. 其实H5+JavaScript写出来的页面,通过获取手机的屏幕长和宽,以及添加声音等就可以实现摇一摇的效果. 第一步,实现手机摇动改变颜色 <!doctype html> <html> <head> <meta char

  • JS实现微信摇一摇原理解析

    本文为大家分享了JS实现微信摇一摇的原理,供大家参考,具体内容如下 实现原理: 1.微信摇一摇事件需要有硬件支撑,必须要求手机中有陀螺仪 2.在JS中给window添加ondevectionmotion事件.该事件在手机晃动,即手机中的陀螺仪发生旋转,该事件会触发 3.触发ondevectionmotion事件,会产生一个事件对象,通过该对象中的键值(accelerationIncludingGravity)来获得该重力加速器对象 4.重力加速器对象中含有陀螺仪的坐标,通过重力加速器对象.x -

  • Android 微信摇一摇功能实现详细介绍

    Android 微信摇一摇功能实现,最近学习传感器,就想实现摇一摇的功能,上网查了些资料,就整理下.如有错误,还请指正. 开发环境 Android Studio 2.2.1 JDK1.7 API 24 Gradle 2.2.1 相关知识点 加速度传感器 补间动画 手机震动 (Vibrator) 较短 声音/音效 的播放 (SoundPool) 案例: 我们接下来分析一下这个案例, 当用户晃动手机时, 会触发加速传感器, 此时加速传感器会调用相应接口供我们使用, 此时我们可以做一些相应的动画效果,

随机推荐