网页调用微信扫一扫接口

1、准备工作:

   1.1微信浏览器

1.2微信APPID,nonceStr

2、使用方式快速预览

调用扫一扫微信接口。

1需要获取access_token

2获取 $jsapi_ticket

3加密

4返回前端

5前端Js实现接口

3、错误,坑点提示

1、获取的access_token 一定要加缓存,原因是有次数限制,3000

2、组装的url 地址一定要全。 http,https一定 一定不能少

3、Js安全接口一定要配置到域名地址。

二、代码实现

JSSDK类,提供大家参考,建议大家写成一个完整的类包,方便管理,和运用

<?php
/**
* Created by PhpStorm.
* User: JOJO
* Date: 2019/8/4
* Time: 14:53
*/ class JSSDK
{
public $appId;
private $appSecret; /**
* @name 初始化参数
* @author JOJO
* @copyright
*/
public function __construct($appId, $appSecret)
{ $this->appId = $appId; $this->appSecret = $appSecret;
} /**
* @name 获取config接口注入权限验证配置
* @author JOJO
* @copyright
*/
public function getWxConfig()
{ $jsapiTicket = $this->getJsapiTicket();
# - 获取调用页面的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 码升序排序
# - 亦可把参数以数组存值,ksort() - 以升序对关联数组进行排序
$string = "jsapi_ticket=$jsapiTicket&noncestr=$nonceStr&timestamp=$timestamp&url=$url"; $signature = sha1($string); # - 页面所需注入参数
$WxConfig = array(
"appId" => $this->appId,
"nonceStr" => $nonceStr,
"timestamp" => $timestamp,
"url" => $url,
"signature" => $signature,
"rawString" => $string
); return $WxConfig;
} public function getJsapiTicket()
{
if (\Yii::$app->cache->exists('jsapi_ticket')) {
return \Yii::$app->cache->get('jsapi_ticket');
}
$access_token = $this->getAccessToken();
if ($access_token == false) {
return false;
}
$url = sprintf("https://api.weixin.qq.com/cgi-bin/ticket/getticket?access_token=%s&type=jsapi", $access_token);
$res = wx_tools::getCurl($url);
$res = json_decode($res, true);
if (isset($res['errcode']) && $res['errcode'] != 0) {
return false;
}
//这里应该把access_token缓存起来,有效期是7200s
\Yii::$app->cache->set('jsapi_ticket', $res['ticket'], 7000);
return $res['ticket'];
} public function getAccessToken()
{
if (\Yii::$app->cache->exists('access_token')) {
return \Yii::$app->cache->get('access_token');
}
$AppID =$this->appId;//AppID(应用ID)
$AppSecret = this->appSecret;//AppSecret(应用密钥)
$url = 'https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid=' . $AppID . '&secret=' . $AppSecret;
$res = $this->getCurl($url);
$res = json_decode($res, true);
if (isset($res['errcode']) && $res['errcode'] != 0) {
return false;
}
\Yii::$app->cache->set('access_token', $res['access_token'], 7000);
return $res['access_token'];
} /**
* CURL GET 请求
* @param $url
* @return bool|mixed
*/
public function getCurl($url)
{
$curl = curl_init();
if (stripos($url, "https://") !== FALSE) {
curl_setopt($curl, CURLOPT_SSL_VERIFYPEER, FALSE);
curl_setopt($curl, CURLOPT_SSL_VERIFYHOST, FALSE);
curl_setopt($curl, CURLOPT_SSLVERSION, 1); //CURL_SSLVERSION_TLSv1
}
curl_setopt($curl, CURLOPT_URL, $url);
curl_setopt($curl, CURLOPT_RETURNTRANSFER, 1);
$content = curl_exec($curl);
$status = curl_getinfo($curl); if (intval($status["http_code"]) == 200) {
curl_close($curl);
return $content;
} else {
$error = curl_errno($curl);
curl_close($curl);
file_put_contents('../web/logs/notify/error' . date('YmdHi') . '.txt', $error); return false;
}
} /**
* @name 产生随机字符串
* @author JOJO
* @copyright
*/
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;
}
}

  1、controller

$app_id = 'wx4868b98f52c67445';
$app_secret = '016c26ce85e14d19dac305fa1ba05c91';
$obj = new JSSDK($app_id, $app_secret);
$signPackage = $obj->getWxConfig();

2.view

<?php
$web = \yii\helpers\Url::base();
?>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>ttt</title> <meta name="viewport" content="width=device-width,initial-scale=1,user-scalable=0"> <!--通用js-->
<script src="<?= $web ?>/js/jquery-2.1.4.js"></script>
<script src="http://res.wx.qq.com/open/js/jweixin-1.4.0.js" charset="utf-8"></script> </head>
<body>
<div style="display: block">
<a id="saoyisao">扫一扫</a> </div>
<script>
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 都要加到这个列表中
"scanQRCode"
]
}); wx.ready(function () {
// 在这里调用 API
$(document).on("click", "a", function () {
debugger;
wx.scanQRCode({
needResult: 1, // 默认为0,扫描结果由微信处理,1则直接返回扫描结果,
scanType: ["qrCode", "barCode"], // 可以指定扫二维码还是一维码,默认二者都有
success: function (res) {
}
}); })
});
</script>
</body>
</html>

  

微信-JSSDK网页调用-(微信扫一扫)的更多相关文章

  1. 微信JS-SDK 接口调用与 php 遇到的坑

    问题:config:invalid signature一直爆这个错误 解决: 看我把这些坑都总结了一下:要命的invalid signature. https://segmentfault.com/q ...

  2. ASP.NET MVC做的微信WEBAPP中调用微信JSSDK扫一扫

    今天做一个项目,是在微信上用的,微信WEB APP,里面用到了调用手机摄像头扫一扫二维码的功能,记得以前某个项目里写有的,但是找不到之前那个项目源码了,想复制粘贴也复制不了了,只好对着微信的那个开发文 ...

  3. 微信公众号_订阅号_微信JS-SDK网页开发

    微信JS-SDK( 分享接口很常用 ) 是微信公众平台 面向网页开发者提供的基于微信内的网页开发工具包 借助微信高效使用相机.语音.选题.位置等手机系统的能力,同时可以直接使用微信分享.扫一扫.支付等 ...

  4. 微信公众号对接JS-SDK接口 调用微信内置地图

    微信js-sdk开发文档:https://developers.weixin.qq.com/doc/offiaccount/OA_Web_Apps/JS-SDK.html 1.页面配置 引用微信js- ...

  5. 微信公众平台开发——为何不能在网页调用微信jsapi?

    说到这问题,相信大部分程序员老手都会轻蔑一笑,当然是跨域导致的啊!但是为了一些小白,我觉得还是很有必要再说一次的. 首先介绍什么是跨域,由于浏览器的同源策略,出于防范跨站脚本的攻击,禁止客户端脚本( ...

  6. 微信小程序调用微信支付

    1,首先我们先缕清支付的整个流程,详见https://pay.weixin.qq.com/wiki/doc/api/wxa/wxa_api.php?chapter=7_4&index=3,第一 ...

  7. 微信小程序调用微信支付接口

    本文链接:https://blog.csdn.net/u012667477/article/details/80940578前言:应项目要求,需要使用微信小程序做支付,写完后告知手续费太高方案不予通过 ...

  8. 微信小程序调用微信登陆获取openid及用户信息 java做为服务端

    转载的文章,很不错 https://blog.csdn.net/weilai_zhilu/article/details/77932630

  9. .Net微信网页开发之使用微信JS-SDK调用微信扫一扫功能

    前言: 之前有个项目需要调用微信扫描二维码的功能,通过调用微信扫码二维码功能,然后去获取到系统中生成的二维码信息.正好微信JS-SDK提供了调用微信扫一扫的功能接口,下面让我们来看看是如何实现的吧. ...

  10. 小程序webview调用微信扫一扫的“曲折”思路

    自上一篇遇到webview中没有返回按钮之后,虽然跳出坑了.解决方案:<小程序webview跳转页面后没有返回按钮完美解决方案> 但是,小程序踩坑之路并没有结束.在公众号网页中通过配置AP ...

随机推荐

  1. 导航条透明,ios11系统,会出现偏移64的问题

    在当前页面加入下面方法 - (void)viewWillAppear:(BOOL)animated{ [super viewWillAppear:animated]; [self.navigation ...

  2. Flutter Web预览时白屏解决方法

    原因是因为运行 flutter run 是自动选择渲染器 桌面端WEB浏览器默认使用  CanvasKit渲染器 移动端WEB浏览器默认使用  HTML渲染器 问题就出在了CanvasKit渲染器,他 ...

  3. C++运算符重载引用传参与返回引用的小小心得

    1 #include <bits/stdc++.h> 2 3 using namespace std; 4 5 //平面向量类,提供完成向量运算和比较的API 6 //除递增运算符和左移运 ...

  4. Mybatis-plus的自定义分页搭配sql Server数据库使用

    原文出处:mybatisplus查询分页并且排序报错解决方法,适用于自定义sql和sqlserver_十七梦的博客-CSDN博客 一开始使用过的是官方文档来写分页,结果出现了如果不在最后添加ORDER ...

  5. 2003031118-李伟-Python数据分析第三周作业-第一次作业

    项目 NumPy数值计算基础 博客名称 2003031118-李伟-Python数据分析第三周作业-第一次作业 课程班级博客链接 https://edu.cnblogs.com/campus/pexy ...

  6. HarmonyOS_Text_Image

    Text组件 ohos:属性 id="$+id:text_helloworld" #在程序中控制,需要id="$+id:name",转回MainAbilityS ...

  7. 4、jmeter的断言技术

    断言:从反馈的结果来个需求匹配,是不是想要的内容 注:断言必要的时候才用  用过了会影响速度 1.操作步骤: 去选择自己想要响应的文本或者代码或者信息等等..... 2.断言相应大小的字节 3.断言响 ...

  8. Matlab字体设置中找不到字体的解决方法(转载)

    Matlab字体设置中找不到字体 Matlab默认的字体实在不好看,一般都需要重新设置字体. 在其字体设置中有些字体不能同时支持中文和英文,我在之前的博客中说过,如何为Matlab设置一款好看的同时兼 ...

  9. 磊磊零基础打卡算法:day19 c++字符串hash

    5.22 字符串hash: 字符哈希串的意思 其实就是将字符串的前缀转换为数来存值由于每位的权值是不一样的 所以每个前缀值都对应着唯一的一种字符串: 主要用途:字符串/数据的比较,是kmp的一种替代: ...

  10. Matlab %贰

    第二章 APPLICATIONS OF MATLAB IN ENGINEERING MATLAB Script %:注解 %%:分节符 Relational Operators < <= ...