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


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 相关文章推荐
一个从别的网站抓取信息的例子(域名查询)
Oct 09 PHP
PHP 递归效率分析
Nov 24 PHP
用php解析html的实现代码
Aug 08 PHP
php多层数组与对象的转换实例代码
Aug 05 PHP
php实现telnet功能示例
Apr 08 PHP
PHP获取youku视频真实flv文件地址的方法
Dec 23 PHP
smarty模板引擎之配置文件数据和保留数据
Mar 30 PHP
php+curl 发送图片处理代码分享
Jul 09 PHP
CI框架AR数据库操作常用函数总结
Nov 21 PHP
PHP Class SoapClient not found解决方法
Jan 20 PHP
对php 判断http还是https,以及获得当前url的方法详解
Jan 15 PHP
Thinkphp极验滑动验证码实现步骤解析
Nov 24 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
Yii框架中memcache用法实例
2014/12/03 PHP
php+ajax实现无刷新分页
2015/11/18 PHP
php中使用websocket详解
2016/09/23 PHP
PHP格式化显示时间date()函数代码
2018/10/03 PHP
可拖动窗口,附带鼠标控制渐变透明,开启关闭功能
2006/06/26 Javascript
jquery select选中的一个小问题
2009/10/11 Javascript
javascript判断ie浏览器6/7版本加载不同样式表的实现代码
2011/12/26 Javascript
javascript动画浅析
2012/08/30 Javascript
实现动画效果核心方式的js代码
2013/09/27 Javascript
对之前写的jquery分页做下升级
2014/06/19 Javascript
实例讲解jquery与json的结合
2016/01/07 Javascript
浅谈javascript运算符——条件,逗号,赋值,()和void运算符
2016/07/15 Javascript
浅谈JSON.stringify()和JOSN.parse()方法的不同
2016/08/29 Javascript
angular仿支付宝密码框输入效果
2017/03/25 Javascript
nodejs创建简易web服务器与文件读写的实例
2017/09/07 NodeJs
vue组件学习教程
2017/09/09 Javascript
详解如何去除vue项目中的#——History模式
2017/10/13 Javascript
vue2.0组件之间传值、通信的多种方式(干货)
2018/02/10 Javascript
JavaScript RegExp 对象用法详解
2019/09/24 Javascript
[02:52]DOTA2新手基础教程 米波
2014/01/21 DOTA
Python程序设计入门(4)模块和包
2014/06/16 Python
用python处理MS Word的实例讲解
2018/05/08 Python
Python3 执行系统命令并获取实时回显功能
2019/07/09 Python
Django REST framework内置路由用法
2019/07/26 Python
python抓取多种类型的页面方法实例
2019/11/20 Python
解决pyPdf和pyPdf2在合并pdf时出现异常的问题
2020/04/03 Python
Pytorch之Tensor和Numpy之间的转换的实现方法
2020/09/03 Python
webView加载html图片遇到的问题解决
2019/10/08 HTML / CSS
Elemis美国官网:英国的第一豪华护肤品牌
2018/03/15 全球购物
Notino希腊:购买香水和美容产品
2019/07/25 全球购物
编写用C语言实现的求n阶阶乘问题的递归算法
2014/10/21 面试题
应届生个人求职信模板
2013/11/26 职场文书
民政局副局长民主生活会个人对照检查材料
2014/09/19 职场文书
六五普法先进个人主要事迹材料
2015/11/03 职场文书
将Python代码打包成.exe可执行文件的完整步骤
2021/05/12 Python
python计算列表元素与乘积详情
2022/08/05 Python