微信小程序webview实现长按点击识别二维码功能示例


Posted in Javascript onJanuary 24, 2019

本文实例讲述了微信小程序webview实现长按点击识别二维码功能。分享给大家供大家参考,具体如下:

场景:微信小程序,使用webview控件。需求:点击图片后长按图片出现“识别二维码”

1、JS代码:

<script src="http://res.wx.qq.com/open/js/jweixin-1.2.0.js"></script>
<script type="text/javascript">
$(function(){
  var returnData = false;
  $.ajax({
   type  : "get",
   url  : 'http://app.ka.com/m/config.php',
   data  : [],
   async  : false,
   success: function(data,textStatus,jqXHR){
        returnData = data;
        //console.log(returnData);
      }
  });//end ajax
  var returnData = eval('(' + returnData + ')');
  console.log(returnData);
  var appId     = returnData.appId;
  var timestamp   = returnData.timestamp;
  var nonceStr   = returnData.nonceStr;
  var signature   = returnData.signature;
     wx.config({
      debug: true, //调试阶段建议开启
      appId: appId,
      timestamp: timestamp,
      nonceStr: nonceStr,
      signature: signature,
      jsApiList: [
          /*
          * 所有要调用的 API 都要加到这个列表中
          * 这里以图像接口为例
          */
         "chooseImage",
         "previewImage",
         "uploadImage",
         "downloadImage",
         "scanQRCode"
      ]
     });
      wx.ready(function() {
      //alert(3);
        wx.checkJsApi({
           jsApiList : ['scanQRCode','previewImage'],
           success : function(res) {
           }
        });
          $("img").click(function(){
            var url = "http://app.ka.com/"+$(this).attr("src");
            wx.previewImage({
              current: url, // 当前显示图片的http链接
              urls: [url] // 需要预览的图片http链接列表
            });
          });
      });
      wx.error(function(res){
        // config信息验证失败会执行error函数,如签名过期导致验证失败,具体错误信息可以打开config的debug模式查看,也可以在返回的res参数中查看,对于SPA可以在这里更新签名。
        console.log(res);
      });
});
</script>

2、服务端代码(获取config配置信息):

<?php
date_default_timezone_set("Asia/Shanghai");
$jssdk = new Jssdk();
$signPackage = $jssdk->getSignPackage();
echo json_encode($signPackage);exit;
class Jssdk
{
  private $_CI;
  private $appId;
  private $appSecret;
  public function __construct($appId='wx666666', $appSecret='ee32') {
    $this->appId = $appId;
    $this->appSecret = $appSecret;
  }
  public function getSignPackage() {
    $jsapiTicket = $this->getJsApiTicket();
    // 注意 URL 一定要动态获取,不能 hardcode.
    $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,
      'jsapiTicket' =>$jsapiTicket,
    );
    return $signPackage;
  }
  private function createNonceStr($length = 16) {
    $chars = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789";
    $str = "";
    for ($i = 0; $i < $length; $i++) {
      $str .= substr($chars, mt_rand(0, strlen($chars) - 1), 1);
    }
    return $str;
  }
  private function getJsApiTicket() {
    // jsapi_ticket 应该全局存储与更新,以下代码以写入到文件中做示例
    $data = $this->get_php_file("jsapi_ticket");
    //echo $data['expire_time'].'------'.time();
    //print_r($data);exit;
    if (!isset($data['jsapi_ticket']) || (isset($data['expire_time']) && $data['expire_time'] < time())) {
      //echo 1111;
      $accessToken = $this->getAccessToken();
      // 如果是企业号用以下 URL 获取 ticket
      // $url = "https://qyapi.weixin.qq.com/cgi-bin/get_jsapi_ticket?access_token=$accessToken";
      $url = "https://api.weixin.qq.com/cgi-bin/ticket/getticket?type=jsapi&access_token=$accessToken";
      //echo $url;
      $res = json_decode($this->httpGet($url), true);
      $ticket = isset($res['ticket']) ? $res['ticket'] : false;
      if ($ticket) {
        $data['expire_time'] = time() + 7160;
        $data['token_value'] = $ticket;
        $this->set_php_file("jsapi_ticket", $data);
      }
    } else {
      //echo 22222;
      $ticket = $data['jsapi_ticket'];
    }
    return $ticket;
  }
  public function getAccessToken() {
    // access_token 应该全局存储与更新,以下代码以写入到文件中做示例
    $data = $this->get_php_file("access_token");
    if (!isset($data['access_token']) || (isset($data['expire_time']) && $data['expire_time'] < time())) {
      // 如果是企业号用以下URL获取access_token
      // $url = "https://qyapi.weixin.qq.com/cgi-bin/gettoken?corpid=$this->appId&corpsecret=$this->appSecret";
      $url = "https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid=$this->appId&secret=$this->appSecret";
      $res = json_decode($this->httpGet($url));
      //var_dump($res);exit;
      $access_token = $res->access_token;
      if ($access_token) {
        $data['expire_time'] = time() + 7160;
        $data['token_value'] = $access_token;
        $this->set_php_file("access_token", $data);
      }
    } else {
      $access_token = $data['access_token'];
    }
    return $access_token;
  }
  private function httpGet($url) {
    $curl = curl_init();
    curl_setopt($curl, CURLOPT_RETURNTRANSFER, true);
    curl_setopt($curl, CURLOPT_TIMEOUT, 500);
    // 为保证第三方服务器与微信服务器之间数据传输的安全性,所有微信接口采用https方式调用,必须使用下面2行代码打开ssl安全校验。
    // 如果在部署过程中代码在此处验证失败,请到 http://curl.haxx.se/ca/cacert.pem 下载新的证书判别文件。
    curl_setopt($curl, CURLOPT_SSL_VERIFYPEER, 0);
    curl_setopt($curl, CURLOPT_SSL_VERIFYHOST, 0);
    curl_setopt($curl, CURLOPT_URL, $url);
    $res = curl_exec($curl);
    curl_close($curl);
    return $res;
  }
  private function get_php_file($token_name) {
    if(file_exists($token_name)) return false;
    return json_decode(file_get_contents($token_name), true);
  }
  private function set_php_file($token_name, $data) {
    $fp = fopen($token_name, "w");
    fwrite($fp, "<?php exit();?>" . json_encode($data));
    fclose($fp);
  }
}

这里再为大家推荐一款功能相似的在线工具供大家参考:

在线二维码解码识别工具:
http://tools.3water.com/transcoding/trans_qrcode

希望本文所述对大家微信小程序开发有所帮助。

Javascript 相关文章推荐
动态加载JS文件的三种方法
Nov 08 Javascript
JavaScript sup方法入门实例(把字符串显示为上标)
Oct 20 Javascript
详解js静态资源文件请求的处理
Aug 01 Javascript
angular4 如何在全局设置路由跳转动画的方法
Aug 30 Javascript
Angular2的管道Pipe的使用方法
Nov 07 Javascript
详解Vue.directive 自定义指令
Mar 27 Javascript
详解JavaScript的变量
Apr 04 Javascript
jquery树形插件zTree高级使用详解
Aug 16 jQuery
Vue切换div显示隐藏,多选,单选代码解析
Jul 14 Javascript
如何手写一个简易的 Vuex
Oct 10 Javascript
在Vue中使用Viser说明(基于AntV-G2可视化引擎)
Oct 28 Javascript
JavaScript 防盗链的原理以及破解方法
Dec 29 Javascript
微信小程序MUI导航栏透明渐变功能示例(通过改变rgba的a值实现)
Jan 24 #Javascript
微信小程序MUI导航栏透明渐变功能示例(通过改变opacity实现)
Jan 24 #Javascript
微信小程序导航栏滑动定位功能示例(实现CSS3的positionsticky效果)
Jan 24 #Javascript
在Node.js下运用MQTT协议实现即时通讯及离线推送的方法
Jan 24 #Javascript
记一次vue去除#问题处理经过小结
Jan 24 #Javascript
微信小程序MUI侧滑导航菜单示例(Popup弹出式,左侧滑动,右侧不动)
Jan 23 #Javascript
微信小程序MUI侧滑导航菜单示例(Popup弹出式,左侧不动,右侧滑动)
Jan 23 #Javascript
You might like
用PHP函数解决SQL injection
2006/10/09 PHP
linux系统上支持php的 iconv()函数的方法
2011/10/01 PHP
php通过记录IP来防止表单重复提交方法分析
2014/12/16 PHP
PHP会话控制实例分析
2016/12/24 PHP
为何说PHP引用是个坑,要慎用
2018/04/02 PHP
PHP执行普通shell命令流程解析
2020/08/24 PHP
jQuery1.6 类型判断实现代码
2011/09/01 Javascript
关于锚点跳转及jQuery下相关操作与插件
2012/10/01 Javascript
JavaScript实现页面跳转的方式汇总
2016/05/16 Javascript
JavaScript定时器制作弹窗小广告
2017/02/05 Javascript
原生JS获取元素的位置与尺寸实现方法
2017/10/18 Javascript
Angular2使用vscode断点调试ts文件的方法
2017/12/13 Javascript
Javascript读写cookie的实例源码
2019/03/16 Javascript
JS为什么说async/await是generator的语法糖详解
2019/07/11 Javascript
WEEX环境搭建与入门详解
2019/10/16 Javascript
关于vue的列表图片选中打钩操作
2020/09/09 Javascript
jquery实现点击左右按钮切换图片
2021/01/27 jQuery
使用Python写一个小游戏
2018/04/02 Python
NumPy 数学函数及代数运算的实现代码
2018/07/18 Python
Python实现八皇后问题示例代码
2018/12/09 Python
python设计微型小说网站(基于Django+Bootstrap框架)
2019/07/08 Python
python入门之基础语法学习笔记
2020/02/08 Python
开启Django博客的RSS功能的实现方法
2020/02/17 Python
详解Python IO编程
2020/07/24 Python
手工制作的意大利皮革运动鞋:KOIO
2020/01/05 全球购物
为什么要优先使用同步代码块而不是同步方法?
2013/01/30 面试题
大四自我鉴定范文
2013/10/06 职场文书
商务助理岗位职责
2013/11/13 职场文书
幼儿园教师国培感言
2014/02/02 职场文书
校园活动宣传方案
2014/03/28 职场文书
主题团日活动总结
2014/06/25 职场文书
单位委托书怎么写
2014/08/02 职场文书
机关副主任个人四风问题整改措施
2014/09/26 职场文书
药店收银员岗位职责
2015/04/07 职场文书
python cv2图像质量压缩的算法示例
2021/06/04 Python
MySQL8.0.18配置多主一从
2021/06/21 MySQL