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


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 相关文章推荐
Zend Studio for Eclipse的java.lang.NullPointerException错误的解决方法
Dec 06 PHP
php session和cookie使用说明
Apr 07 PHP
PHP开发微信支付的代码分享
May 25 PHP
ThinkPHP写数组插入与获取最新插入数据ID实例
Nov 03 PHP
PHP 正则表达式小结
Feb 12 PHP
php强制用户转向www域名的方法
Jun 19 PHP
PHP统计当前在线用户数实例讲解
Oct 21 PHP
PHP中的密码加密的解决方案总结
Oct 26 PHP
thinkPHP5 ACL用户权限模块用法详解
May 10 PHP
PHP实现将优酷土豆腾讯视频html地址转换成flash swf地址的方法
Aug 04 PHP
详解thinkphp5+swoole实现异步邮件群发(SMTP方式)
Oct 13 PHP
如何优雅的使用 laravel 的 validator验证方法
Nov 11 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
Thinkphp5.0框架的Db操作实例分析【连接、增删改查、链式操作等】
2019/10/11 PHP
HTML5如何适配 iPhone IOS 底部黑条
2021/03/09 HTML / CSS
JQuery团队打造的javascript单元测试工具QUnit介绍
2010/02/26 Javascript
本地图片预览(支持IE6/IE7/IE8/Firefox3)经验总结
2013/03/25 Javascript
javascript变量作用域使用中常见错误总结
2013/03/26 Javascript
js实现登陆遮罩效果的方法
2015/07/28 Javascript
Node.js的Web模板引擎ejs的入门使用教程
2016/06/06 Javascript
ES6中的rest参数与扩展运算符详解
2017/07/18 Javascript
[js高手之路]设计模式系列课程-发布者,订阅者重构购物车的实例
2017/08/29 Javascript
纯html+css+javascript实现楼层跳跃式的页面布局(实例代码)
2017/10/25 Javascript
详解angular2如何手动点击特定元素上的点击事件
2018/10/16 Javascript
Vue 处理表单input单行文本框的实例代码
2019/05/09 Javascript
js实现自动播放匀速轮播图
2020/02/06 Javascript
JavaScript ECMA-262-3 深入解析(一):执行上下文实例分析
2020/04/25 Javascript
使用vue cli4.x搭建vue项目的过程详解
2020/05/08 Javascript
Nuxt pages下不同的页面对应layout下的页面布局操作
2020/11/05 Javascript
[06:01]刀塔次级联赛top10第一期
2014/11/07 DOTA
Python3实现从指定路径查找文件的方法
2015/05/22 Python
python字符串连接方法分析
2016/04/12 Python
Python实现快速排序算法及去重的快速排序的简单示例
2016/06/26 Python
Python中的变量和作用域详解
2016/07/13 Python
python代码编写计算器小程序
2020/03/30 Python
使用python实现对元素的长截图功能
2019/11/14 Python
python每5分钟从kafka中提取数据的例子
2019/12/23 Python
Python中Selenium库使用教程详解
2020/07/23 Python
Python利用myqr库创建自己的二维码
2020/11/24 Python
html5/css3响应式页面开发总结
2018/10/16 HTML / CSS
Right-on官方网站:日本知名的休闲服装品牌
2019/07/12 全球购物
企业管理培训感言
2014/01/27 职场文书
出国英文推荐信
2014/05/10 职场文书
党建目标管理责任书
2014/07/25 职场文书
带香烟到学校抽的检讨书
2014/09/25 职场文书
2015年春节标语口号
2014/12/09 职场文书
医院科室评语
2015/01/04 职场文书
公司业务员管理制度
2015/08/05 职场文书
解决Git推送错误non-fast-forward的方法
2022/06/25 Servers