微信小程序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 相关文章推荐
基于jQuery的消息提示插件 DivAlert之旅(二)
Apr 01 Javascript
JavaScript函数作用域链分析
Feb 13 Javascript
H5上传本地图片并预览功能
May 08 Javascript
vuejs手把手教你写一个完整的购物车实例代码
Jul 06 Javascript
Vuex入门到上手教程
Jun 20 Javascript
vue实现歌手列表字母排序下拉滚动条侧栏排序实时更新
May 14 Javascript
微信小程序如何连接Java后台
Aug 08 Javascript
浅谈Vue为什么不能检测数组变动
Oct 14 Javascript
vue实现浏览器全屏展示功能
Nov 27 Javascript
小程序新版订阅消息模板消息
Dec 31 Javascript
javascript 易错知识点实例小结
Apr 25 Javascript
vue任意关系组件通信与跨组件监听状态vue-communication
Oct 18 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生成可点击刷新的验证码简单示例
2016/05/13 PHP
JavaScript在IE和Firefox(火狐)的不兼容问题解决方法小结
2010/04/13 Javascript
jquery 新手学习常见问题解决方法
2010/04/18 Javascript
用jQuery模拟页面加载进度条的实现代码
2011/12/19 Javascript
jQuery实现的一个自定义Placeholder属性插件
2014/08/11 Javascript
JavaScript插件化开发教程 (二)
2015/01/27 Javascript
JS 判断某变量是否为某数组中的一个值的3种方法(总结)
2017/07/10 Javascript
nodejs实现简单的gulp打包
2017/12/21 NodeJs
React路由管理之React Router总结
2018/05/10 Javascript
[06:25]DOTA2英雄梦之声_第17期_大地之灵
2014/06/20 DOTA
Python素数检测实例分析
2015/06/15 Python
从源码解析Python的Flask框架中request对象的用法
2016/06/02 Python
Python打印输出数组中全部元素
2018/03/13 Python
python学习入门细节知识点
2018/03/29 Python
对numpy数据写入文件的方法讲解
2018/07/09 Python
Django中数据库的数据关系:一对一,一对多,多对多
2018/10/21 Python
在python中利用GDAL对tif文件进行读写的方法
2018/11/29 Python
Python使用numpy模块实现矩阵和列表的连接操作方法
2019/06/26 Python
Django rstful登陆认证并检查session是否过期代码实例
2019/08/13 Python
利用PyTorch实现VGG16教程
2020/06/24 Python
python 实现倒计时功能(gui界面)
2020/11/11 Python
CSS3区域模块region相关编写示例
2015/08/28 HTML / CSS
详解HTML5中ol标签的用法
2015/09/08 HTML / CSS
香港钟表珠宝首饰商城:OneMallTime网摩间
2016/10/14 全球购物
英国最大的在线奢侈手表零售商:Jura Watches
2018/01/29 全球购物
英国男士时尚网站:Dandy Fellow
2018/02/09 全球购物
美国汽车性能部件和赛车零件网站:Vivid Racing
2018/03/27 全球购物
即时搜索数百万张门票:SeatsForEveryone.com
2018/08/26 全球购物
Theflamel意大利:女士奢华服装、鞋子和配件
2020/01/11 全球购物
季度思想汇报
2014/01/01 职场文书
自我鉴定四大框架
2014/01/17 职场文书
项目负责人任命书
2014/06/04 职场文书
就业协议书范本
2014/10/08 职场文书
python中的mysql数据库LIKE操作符详解
2021/07/01 MySQL
攻略丨滑雪究竟该选哪款对讲机?
2022/02/18 无线电
AJAX引擎原理以及XmlHttpRequest对象的axios、fetch区别详解
2022/04/09 Javascript