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


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 CLI实现简单的数据库实时监控调度
Jul 01 PHP
收集的二十一个实用便利的PHP函数代码
Apr 22 PHP
PHP 读取Postgresql中的数组
Apr 14 PHP
深入PHP异步执行的详解
Jun 03 PHP
基于PHP文件操作的详解
Jun 05 PHP
PHPMailer发送HTML内容、带附件的邮件实例
Jul 01 PHP
php使用Cookie控制访问授权的方法
Jan 21 PHP
PHP中使用jQuery+Ajax实现分页查询多功能操作(示例讲解)
Sep 17 PHP
PHP设计模式之抽象工厂模式实例分析
Mar 25 PHP
tp5修改(实现即点即改)
Oct 18 PHP
phpmyadmin在宝塔面板里进不去的解决方案
Jul 06 PHP
基于PHP实现用户登录注册功能的详细教程
Aug 04 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
PHP4和PHP5性能测试和对比 测试代码与环境
2007/08/17 PHP
php实现博客,论坛图片防盗链的方法
2016/10/15 PHP
php 获取xml接口数据的处理方法
2018/05/31 PHP
激活 ActiveX 控件
2006/10/09 Javascript
实现复选框全选/全不选切换
2006/12/23 Javascript
改善用户体验的五款jQuery插件分享
2011/05/22 Javascript
js怎么终止程序return不行换jfslk
2013/05/30 Javascript
node.js开发中使用Node Supervisor实现监测文件修改并自动重启应用
2014/11/04 Javascript
举例讲解AngularJS中的模块
2015/06/17 Javascript
jQuery实现查找最近父节点的方法
2016/06/23 Javascript
微信小程序 教程之WXML
2016/10/18 Javascript
WEB 前端开发中防治重复提交的实现方法
2016/10/26 Javascript
javascript动画之磁性吸附效果篇
2016/12/09 Javascript
Vue使用枚举类型实现HTML下拉框步骤详解
2018/02/05 Javascript
JS实现获取word文档内容并输出显示到html页面示例
2018/06/23 Javascript
JS实现电商商品展示放大镜特效
2020/01/07 Javascript
[19:15]DK战队纪录片
2014/09/02 DOTA
在Python3中使用asyncio库进行快速数据抓取的教程
2015/04/02 Python
Python使用QRCode模块生成二维码实例详解
2017/06/14 Python
python 垃圾收集机制的实例详解
2017/08/20 Python
Python实现螺旋矩阵的填充算法示例
2017/12/28 Python
解决pandas.DataFrame.fillna 填充Nan失败的问题
2018/11/06 Python
python使用Qt界面以及逻辑实现方法
2019/07/10 Python
Python二元赋值实用技巧解析
2019/10/25 Python
Python socket聊天脚本代码实例
2020/01/02 Python
pytorch 图像中的数据预处理和批标准化实例
2020/01/15 Python
pytorch实现MNIST手写体识别
2020/02/14 Python
canvas绘制图片drawImage使用方法
2020/09/15 HTML / CSS
FitFlop美国官网:英国符合人体工学的鞋类品牌
2018/10/05 全球购物
你常见到的runtime exception
2016/09/05 面试题
前台文员岗位职责
2013/12/28 职场文书
西北政法大学自主招生自荐信
2014/01/29 职场文书
行政专员求职信范文
2014/05/03 职场文书
慰问信模板
2015/02/14 职场文书
小程序与后端Java接口交互实现HelloWorld入门
2021/07/09 Java/Android
JS中forEach()、map()、every()、some()和filter()的用法
2022/05/11 Javascript