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


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操作sqlserver关于时间日期读取的小小见解
Nov 29 PHP
用php的ob_start来生成静态页面的方法分析
Mar 09 PHP
php的webservice的wsdl的XML无法显示问题的解决方法
Mar 11 PHP
ThinkPHP3.1新特性之动态设置自动完成和自动验证示例
Jun 19 PHP
PHP中的替代语法简介
Aug 22 PHP
讲解WordPress中用于获取评论模板和搜索表单的PHP函数
Dec 28 PHP
SSO单点登录的PHP实现方法(Laravel框架)
Mar 23 PHP
PHP实现的服务器一致性hash分布算法示例
Aug 09 PHP
php中的explode()函数实例介绍
Jan 18 PHP
PHP getDocNamespaces()函数讲解
Feb 03 PHP
关于PHP中interface的用处详解
Jul 26 PHP
PHP autoload使用方法及步骤详解
Sep 05 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实现的服务器一致性hash分布算法示例
2018/08/09 PHP
javascript中利用数组实现的循环队列代码
2010/01/24 Javascript
使用Jquery实现点击文字后变成文本框且可修改
2013/09/21 Javascript
js日期范围初始化得到前一个月日期的方法
2015/05/05 Javascript
jquery插件jquery.beforeafter.js实现左右拖拽分隔条对比图片的方法
2015/08/07 Javascript
JS基础随笔(菜鸟必看篇)
2016/07/13 Javascript
javascript简单进制转换实现方法
2016/11/24 Javascript
Vuex2.0+Vue2.0构建备忘录应用实践
2016/11/30 Javascript
Html5+jQuery+CSS制作相册小记录
2016/12/30 Javascript
javascript ES6中箭头函数注意细节小结
2017/02/17 Javascript
JavaScript实现前端实时搜索功能
2020/03/26 Javascript
node.js的exports、module.exports与ES6的export、export default深入详解
2017/10/26 Javascript
jQuery实现数字自动增加或者减少的动画效果示例
2018/12/11 jQuery
layui动态渲染生成select的option值方法
2019/09/23 Javascript
关于在LayUI中使用AJAX提交巨坑记录
2019/10/25 Javascript
vue通过接口直接下载java生成好的Excel表格案例
2020/10/26 Javascript
python dict remove数组删除(del,pop)
2013/03/24 Python
Python实现列表删除重复元素的三种常用方法分析
2017/11/24 Python
轻松实现TensorFlow微信跳一跳的AI
2018/01/05 Python
django manage.py扩展自定义命令方法
2018/05/27 Python
让你Python到很爽的加速递归函数的装饰器
2019/05/26 Python
Django框架模型简单介绍与使用分析
2019/07/18 Python
python中eval与int的区别浅析
2019/08/11 Python
django实现web接口 python3模拟Post请求方式
2019/11/19 Python
Python 中判断列表是否为空的方法
2019/11/24 Python
Python字符串、列表、元组、字典、集合的补充实例详解
2019/12/20 Python
Goodee官方商店:迷你投影仪
2021/03/15 全球购物
迪士尼法国在线商店:shopDisney FR
2020/12/03 全球购物
查询优化的一般准则有哪些
2015/03/08 面试题
团员个人的自我评价
2013/12/02 职场文书
中学生自我鉴定
2014/02/04 职场文书
《草原》教学反思
2014/02/15 职场文书
莫言诺贝尔获奖演讲稿
2014/05/21 职场文书
2015国际残疾人日活动总结
2015/03/24 职场文书
网络新闻该怎么写?这些写作技巧你都知道吗?
2019/08/26 职场文书
不要在HTML中滥用div
2021/05/08 HTML / CSS