PHP头条
热点:

使用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!"."
"); }elseif ($this->parameters["desc"] == null ) { throw new SDKRuntimeException("缺少抽奖活动描述desc!"."
"); }elseif ($this->parameters["begin_time"] == null) { throw new SDKRuntimeException("缺少活动开始时间 begin_time!"."
"); }elseif ($this->parameters["expire_time"] == null) { throw new SDKRuntimeException("缺少活动结束时间 expire_time!"."
"); }elseif ($this->parameters["total"] == null) { throw new SDKRuntimeException("缺少红包总数total!"."
"); }elseif ($this->parameters["jump_url"] == null) { throw new SDKRuntimeException("缺少红包关注跳转连接jump_url!"."
"); }elseif ($this->parameters["key"] == null) { throw new SDKRuntimeException("缺少红包key!"."
"); } $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

需要商户证书

请求参数说明

请求示例

   
   
   
   
   
   
   
   
   
   
   
   
   
   
   
   

返回数据说明

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

成功示例

  
 
 
 
 
 
 
10010404 
 
 
3 
 
 
 

失败示例

    
 
 
 
 
 
     
10010404 
  
3 
 
/**
 * 摇一摇红包预下单 
 * @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!"."
"); }elseif ($this->parameters["send_name"] == null ) { throw new SDKRuntimeException("缺少发红包接口必填参数send_name!"."
"); }elseif ($this->parameters["total_amount"] == null) { throw new SDKRuntimeException("缺少发红包接口必填参数total_amount!"."
"); }elseif ($this->parameters["total_num"] == null) { throw new SDKRuntimeException("缺少发红包接口必填参数total_num!"."
"); }elseif ($this->parameters["wishing"] == null) { throw new SDKRuntimeException("缺少发红包接口必填参数wishing!"."
"); }elseif ($this->parameters["act_name"] == null) { throw new SDKRuntimeException("缺少发红包接口必填参数act_name!"."
"); }elseif ($this->parameters["remark"] == null) { throw new SDKRuntimeException("缺少发红包接口必填参数remark!"."
"); } $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 !"."
"); }else if(empty($this->parameters["prize_info_list"])){ throw new SDKRuntimeException("缺少抽奖活动红包 prize_info_list !"."
"); } $this->parameters["mchid"] = WxPayConf_pub::MCHID;//授权商户号 $this->parameters["sponsor_appid"] = WxPayConf_pub::APPID;//授权上号appid return json_encode($this->parameters); //echo json_encode($this->parameters);die; }catch (SDKRuntimeException $e) { die($e->errorMessage()); } } function setJsonArray($parameter, $parameterValue){ $this->parameters[$this->trimString($parameter)] = $parameterValue; } function hbpreorder() { $data = $this->createJson(); $result = $this->curl_post($this->url,$data); $result = json_decode($result); return $result; } function curl_post($url,$data) { $curl = curl_init($url); curl_setopt($curl, CURLOPT_CONNECTTIMEOUT, 30); curl_setopt($curl, CURLOPT_TIMEOUT, 10); curl_setopt($curl, CURLOPT_RETURNTRANSFER, TRUE); curl_setopt($curl, CURLOPT_SSL_VERIFYPEER, false); curl_setopt($curl, CURLOPT_POST, 1);//发送一个常规的Post请求 curl_setopt($curl, CURLOPT_POSTFIELDS, $data);//Post提交的数据包 $rv = curl_exec($curl);//输出内容 curl_close($curl); return $rv; } /** * 作用:生成可以获得code的url */ function createOauthUrlForCode($redirectUrl) { $urlObj["appid"] = WxPayConf_pub::APPID; $urlObj["redirect_uri"] = "$redirectUrl"; $urlObj["response_type"] = "code"; $urlObj["scope"] = "snsapi_base"; $urlObj["state"] = "STATE"."#wechat_redirect"; $bizString = $this->formatBizQueryParaMap($urlObj, false); return "https://open.weixin.qq.com/connect/oauth2/authorize?".$bizString; } /** * 作用:生成可以获得openid的url */ function createOauthUrlForOpenid() { $urlObj["appid"] = WxPayConf_pub::APPID; $urlObj["secret"] = WxPayConf_pub::APPSECRET; $urlObj["code"] = $this->code; $urlObj["grant_type"] = "authorization_code"; $bizString = $this->formatBizQueryParaMap($urlObj, false); return "https://api.weixin.qq.com/sns/oauth2/access_token?".$bizString; } /** * 作用:通过curl向微信提交code,以获取openid */ function getOpenid() { $url = $this->createOauthUrlForOpenid(); //初始化curl $ch = curl_init(); //设置超时 curl_setopt($ch, CURLOP_TIMEOUT, $this->curl_timeout); curl_setopt($ch, CURLOPT_URL, $url); curl_setopt($ch,CURLOPT_SSL_VERIFYPEER,FALSE); curl_setopt($ch,CURLOPT_SSL_VERIFYHOST,FALSE); curl_setopt($ch, CURLOPT_HEADER, FALSE); curl_setopt($ch, CURLOPT_RETURNTRANSFER, TRUE); //运行curl,结果以jason形式返回 $res = curl_exec($ch); curl_close($ch); //取出openid $data = json_decode($res,true); $this->openid = $data['openid']; return $this->openid; } /** * 作用:设置code */ function setCode($code_) { $this->code = $code_; } }

调用


    $token = getAccessToken();
    $Redpack = new \lottery_pub($token);
    $lottery_id = ''; //这里读取数据库取出创建活动时返回的 lottery_id $Redpack->setParameter('lottery_id', $lottery_id); //活动id $prize_info_list =array(array('ticket'=>'这里取出预下单返回的sp_ticket')); $Redpack->setJsonArray('prize_info_list', $prize_info_list); //提交 $Redpack->hbpreorder();

抢红包页面 php

function getshakeinfo($access_token,$ticket){
    $getshakeinfourl='https://api.weixin.qq.com/shakearound/user/getshakeinfo?access_token='.$access_token;
     $jo=0;
     if($access_token){
      $data=array('ticket' =>$ticket);
      $rd=$this->curl_post($getshakeinfourl,json_encode($data));
      $jo=json_decode($rd);
     }else{
      echo 'access_token null';
     }
     return $jo;
  }
    $ticket=$_GET['ticket'];//获叏设备信息,包括 U UID 、 major 、 minor ,以及距离、 openID 等信息
    $token = getAccessToken();
    $shake=getshakeinfo($token,$ticket);
    $openid=$shake->data->openid;
    $jsapi = new Common_util_pub(); 
    $noncestr = $jsapi->createNoncestr();
    $parameters = array(
        'lottery_id' =>'创建活动时候返回的活动ID',
        'noncestr'=>$noncestr,
        'openid'=>$openid,
      );
    $signStr = $jsapi->formatBizQueryParaMap($parameters,false);
    $key = '创建活动时候的key';
    $signStr=$signStr."&key=".$key;
    $sign = strtoupper(md5($signStr));

上一步返回的参数填在抢红包html页面

相关文章

PHP之友评论

今天推荐