微信公众号实现会员卡领取功能


Posted in PHP onJune 08, 2017

1、会员卡的领取也需要js-sdk接口(可以参考获取微信公众号获取用户的地理位置信息)(借鉴网址:http://gaoboy.com/article/25.html)

2、 比获取用户地理位置信息多了一个是需要单独获取签名包,签名方式也和获取用户地理位置的不同(这里再说一下获取签名包的方式)

      获取js-sdk签名包:

           1、当前的url、时间戳、随机字符串、jsapiticket进行组合                

//调用js-sdk的签名包
 public function getSignPackage() {
 $jsapiTicket = $this->getJsApiTicket();
 // 注意 URL 一定要动态获取,不能 hardcode.(获取当前网页的url)
 $protocol = (!empty($_SERVER['HTTPS']) && $_SERVER['HTTPS'] !== 'off' || $_SERVER['SERVER_PORT'] == 443) ? "https://" : "http://";
 $url = "$protocol$_SERVER[HTTP_HOST]$_SERVER[REQUEST_URI]";
 //时间戳
 $timestamp = time();
 //随机字符串获取
 $nonceStr = $this->createNonceStr();
 // 这里参数的顺序要按照 key 值 ASCII 码升序排序
 $string = "jsapi_ticket=$jsapiTicket&noncestr=$nonceStr×tamp=$timestamp&url=$url";
 //生成字符串是用来签名用的
 $signature = sha1($string);
 $signPackage = array(
  "appId"  => $this->appid,
  "nonceStr" => $nonceStr,
  "timestamp" => $timestamp,
  "url"  => $url,
  "signature" => $signature,
  "rawString" => $string
 );
 return $signPackage; 
 }

     获取会员卡签名包:      

//使用会员卡领取的签名包
 public function getHuiYuanSignPackage() {
 $apiTicket = $this->getApiTicket();
 // 注意 URL 一定要动态获取,不能 hardcode.(获取当前网页的url)
 $protocol = (!empty($_SERVER['HTTPS']) && $_SERVER['HTTPS'] !== 'off' || $_SERVER['SERVER_PORT'] == 443) ? "https://" : "http://";
 $url = "$protocol$_SERVER[HTTP_HOST]$_SERVER[REQUEST_URI]";
 //时间戳
 $timestamp = time();
 //随机字符串获取
 // $nonceStr = $this->createNonceStr();
 // 这里参数的顺序要按照 key 值 ASCII 码升序排序
 $string = $timestamp.$apiTicket."pVYA_t3RCVF_yhNcO6QCeAmb-1UI";
 //生成字符串是用来签名用的
 $signature = sha1($string);
 $signPackage = array(
  "timestamp" => $timestamp,
  "signature" => $signature,
 );
 return $signPackage; 
 }

详细代码说明:

     HTML页面:         

//引入微信js文件
   <script src="http://res.wx.qq.com/open/js/jweixin-1.0.0.js"></script>
<script type="text/JavaScript">
//配置信息验证接口(填写的js-sdk获取的签名包的参数)
wx.config({
 debug: false,
 appId: '<?PHP echo $signPackage["appId"];?>',
 timestamp: '<?php echo $signPackage["timestamp"];?>',
 nonceStr: '<?php echo $signPackage["nonceStr"];?>',
 signature: '<?php echo $signPackage["signature"];?>',
 jsApiList: [
  // 所有要调用的 API 都要加到这个列表中
  'addCard'
  ]
   });
wx.ready(function(){
        //添加卡券
    document.querySelector('#addCard').onclick = function () {
     wx.addCard({
      cardList: [
      {
       cardId: "",//微信公众号内创建的会员卡的id
       cardExt: '{"timestamp":"<?php echo $huiyuanPackage['timestamp'] ?>","signature":"<?php echo $huiyuanPackage['signature'] ?>"}'//会员卡的签名包
      }
      ],
     //成功之后的回调的函数(通过回调函数该表数据库是否领取会员卡的状态)
      success: function (res) {
      $.ajax({
      url: '__CONTROLLER__/editHuiYuan',
      type: 'post',
      dataType: 'json',
      data: {is_LingQu: '1',user_id:"<?php echo $user['user_id'] ?>"},
      success:function(){
      $("#addCard").html("我的会员卡");
      }
      })
      }
     });
    };
   });
</script>

控制器中的代码:

   类库:https://3water.com/article/115732.htm

public function index(){
 $user_id = session('user_id');
  if($user_id){
  $jssdk = new \Home\Model\WechatModel();
  $signPackage = $jssdk->GetSignPackage();//获取js-sdk签名包
  $huiyuanPackage = $jssdk->getHuiYuanSignPackage();获取会员卡签名包
  //获取用户信息 
  $user = M('user')->where(array('user_id' => $user_id))->find();
  //产品收藏数量统计
  $goods_count = M('goods_shoucang')->where(array('user_id' => $user_id))->count();
  //门店收藏数量统计
  $shop_count = M('shop_shoucang')->where(array('user_id' => $user_id))->count();
  }else{
  //判断该用户是否存在
  $model = new \Home\Model\WechatModel();
  $openid_accesstoken = $model->openId();
  $rst = M('user')->where(array('user_openid' => $openid_accesstoken['openid']))->find();
  if($rst){
   session('openid',$openid_accesstoken['openid']);
   session('user_id', $rst['user_id']);
   $jssdk = new \Home\Model\WechatModel();
   $signPackage = $jssdk->GetSignPackage();
   $huiyuanPackage = $jssdk->getHuiYuanSignPackage();
   //获取用户信息 
   $user = M('user')->where(array('user_id' => $rst['user_id']))->find();
   //产品收藏数量统计
   $goods_count = M('goods_shoucang')->where(array('user_id' => $rst['user_id']))->count();
   //门店收藏数量统计
   $shop_count = M('shop_shoucang')->where(array('user_id' => $rst['user_id']))->count();
  }else{
   $userInfo = $model->getOpenId($openid_accesstoken['openid'],$openid_accesstoken['access_token']);
     $data = array(
      'user_img' => $userInfo['headimgurl'],
      'user_openid' => $userInfo['openid'],
      'user_name' => filter($userInfo['nickname']),
      'user_register_time' => time(),
      'city' => $userInfo['province'].'-'.$userInfo['city'],
     );
   $id = M('user')->add($data);
   session('openid', $userInfo['openid']);
   session('user_id',$id);
   $jssdk = new \Home\Model\WechatModel();
   $signPackage = $jssdk->GetSignPackage();
   $huiyuanPackage = $jssdk->getHuiYuanSignPackage();
   //获取用户信息 
   $user = M('user')->where(array('user_id' => $id))->find();
   //产品收藏数量统计
   $goods_count = M('goods_shoucang')->where(array('user_id' => $id))->count();
   //门店收藏数量统计
   $shop_count = M('shop_shoucang')->where(array('user_id' => $id))->count();
   }
  }
  $this->assign('signPackage', $signPackage);
  $this->assign('huiyuanPackage', $huiyuanPackage);
  $this->assign('user', $user);
  $this->assign('shop_count', $shop_count);
  $this->assign('goods_count', $goods_count);
  $this->display();
 }

以上所述是小编给大家介绍的微信公众号实现会员卡领取功能,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对三水点靠木网站的支持!

PHP 相关文章推荐
PHP新手上路(八)
Oct 09 PHP
php 验证码制作(网树注释思想)
Jul 20 PHP
phpmyadmin里面导入sql语句格式的大量数据的方法
Jun 05 PHP
php的list()的一步操作给一组变量进行赋值的使用
May 18 PHP
PHP autoload与spl_autoload自动加载机制的深入理解
Jun 05 PHP
解决PHP mysql_query执行超时(Fatal error: Maximum execution time …)
Jul 03 PHP
PHP开发框架kohana3 自定义路由设置示例
Jul 14 PHP
smarty实现多级分类的方法
Dec 05 PHP
php正则匹配html中带class的div并选取其中内容的方法
Jan 13 PHP
php去除html标记的原生函数详解
Jan 27 PHP
CodeIgniter记录错误日志的方法全面总结
May 17 PHP
PHP简单实现欧拉函数Euler功能示例
Nov 06 PHP
php图像验证码生成代码
Jun 08 #PHP
php面向对象的用户登录身份验证
Jun 08 #PHP
php实现用户注册密码的crypt加密
Jun 08 #PHP
php封装一个异常的处理类
Jun 08 #PHP
php简单构造json多维数组的方法示例
Jun 08 #PHP
php显示页码分页类的封装
Jun 08 #PHP
PHP 7.0新增加的特性介绍
Jun 08 #PHP
You might like
PHP实现的json类实例
2015/07/28 PHP
使用phpexcel类实现excel导入mysql数据库功能(实例代码)
2016/05/12 PHP
PHP实现简单日历类编写
2020/08/28 PHP
jquery判断字符输入个数(数字英文长度记为1,中文记为2,超过长度自动截取)
2010/10/15 Javascript
Extjs优化(一)删除冗余代码提高运行速度
2013/04/15 Javascript
iframe窗口高度自适应的实现方法
2014/01/08 Javascript
通过XMLHttpRequest和jQuery实现ajax的几种方式
2015/08/28 Javascript
js+canvas绘制五角星的方法
2016/01/28 Javascript
AngularJs Dependency Injection(DI,依赖注入)
2016/09/02 Javascript
jquery层级选择器(匹配父元素下的子元素实现代码)
2016/09/05 Javascript
阿里云ecs服务器中安装部署node.js的步骤
2016/10/08 Javascript
js中动态创建json,动态为json添加属性、属性值的实例
2016/12/02 Javascript
vue中父子组件注意事项,传值及slot应用技巧
2018/05/09 Javascript
Vue.js子组件向父组件通信的方法实例代码详解
2018/12/10 Javascript
jQuery实现王者荣耀手风琴效果
2020/01/17 jQuery
vue实践---vue不依赖外部资源实现简单多语操作
2020/09/21 Javascript
[05:00]第二届DOTA2亚洲邀请赛主赛事第三天比赛集锦.mp4
2017/04/04 DOTA
[00:37]2016完美“圣”典风云人物:rOtk宣传片
2016/12/09 DOTA
python练习程序批量修改文件名
2014/01/16 Python
忘记ftp密码使用python ftplib库暴力破解密码的方法示例
2014/01/22 Python
简单瞅瞅Python vars()内置函数的实现
2019/09/27 Python
Django 再谈一谈json序列化
2020/03/16 Python
python文件操作seek()偏移量,读取指正到指定位置操作
2020/07/05 Python
荷兰浴室和卫浴网上商店:Badkamerxxl.nl
2020/10/06 全球购物
Linux内核的同步机制是什么?主要有哪几种内核锁
2016/07/11 面试题
Java程序员面试题
2016/09/27 面试题
节能环保家庭事迹材料
2014/08/27 职场文书
忠诚教育心得体会
2014/09/03 职场文书
2014高中生入党思想汇报范文
2014/09/13 职场文书
个人反四风对照检查材料思想汇报
2014/09/23 职场文书
教师党员个人总结
2015/02/10 职场文书
护士辞职信怎么写
2015/02/27 职场文书
工会积极分子个人总结
2015/03/03 职场文书
2015年团支部年度工作总结
2015/05/27 职场文书
2015教师个人师德工作总结
2015/10/23 职场文书
创业计划书之校园跑腿公司
2019/09/24 职场文书