微信-JSSDK网页调用-(微信扫一扫)
网页调用微信扫一扫接口
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×tamp=$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网页调用-(微信扫一扫)的更多相关文章
- 微信JS-SDK 接口调用与 php 遇到的坑
问题:config:invalid signature一直爆这个错误 解决: 看我把这些坑都总结了一下:要命的invalid signature. https://segmentfault.com/q ...
- ASP.NET MVC做的微信WEBAPP中调用微信JSSDK扫一扫
今天做一个项目,是在微信上用的,微信WEB APP,里面用到了调用手机摄像头扫一扫二维码的功能,记得以前某个项目里写有的,但是找不到之前那个项目源码了,想复制粘贴也复制不了了,只好对着微信的那个开发文 ...
- 微信公众号_订阅号_微信JS-SDK网页开发
微信JS-SDK( 分享接口很常用 ) 是微信公众平台 面向网页开发者提供的基于微信内的网页开发工具包 借助微信高效使用相机.语音.选题.位置等手机系统的能力,同时可以直接使用微信分享.扫一扫.支付等 ...
- 微信公众号对接JS-SDK接口 调用微信内置地图
微信js-sdk开发文档:https://developers.weixin.qq.com/doc/offiaccount/OA_Web_Apps/JS-SDK.html 1.页面配置 引用微信js- ...
- 微信公众平台开发——为何不能在网页调用微信jsapi?
说到这问题,相信大部分程序员老手都会轻蔑一笑,当然是跨域导致的啊!但是为了一些小白,我觉得还是很有必要再说一次的. 首先介绍什么是跨域,由于浏览器的同源策略,出于防范跨站脚本的攻击,禁止客户端脚本( ...
- 微信小程序调用微信支付
1,首先我们先缕清支付的整个流程,详见https://pay.weixin.qq.com/wiki/doc/api/wxa/wxa_api.php?chapter=7_4&index=3,第一 ...
- 微信小程序调用微信支付接口
本文链接:https://blog.csdn.net/u012667477/article/details/80940578前言:应项目要求,需要使用微信小程序做支付,写完后告知手续费太高方案不予通过 ...
- 微信小程序调用微信登陆获取openid及用户信息 java做为服务端
转载的文章,很不错 https://blog.csdn.net/weilai_zhilu/article/details/77932630
- .Net微信网页开发之使用微信JS-SDK调用微信扫一扫功能
前言: 之前有个项目需要调用微信扫描二维码的功能,通过调用微信扫码二维码功能,然后去获取到系统中生成的二维码信息.正好微信JS-SDK提供了调用微信扫一扫的功能接口,下面让我们来看看是如何实现的吧. ...
- 小程序webview调用微信扫一扫的“曲折”思路
自上一篇遇到webview中没有返回按钮之后,虽然跳出坑了.解决方案:<小程序webview跳转页面后没有返回按钮完美解决方案> 但是,小程序踩坑之路并没有结束.在公众号网页中通过配置AP ...
随机推荐
- mysql-逗号分隔关联查询
牛逼plus 每天一个知识点 tableA id num 1 1001,1002 2 1002 tableB id num name 1 1001 A 2 1002 B 想要的结果: id name ...
- Edge浏览器相关
Ctrl+T 新建页面 Ctrl+W 关闭页面 不可复制的页面,前加read: 若是不可访问 变read://http:// 阅读可翻译,也可有图片字典 还可用插件: 截图软件:Snipaste 微 ...
- OpenGL_Extension_Viewer
使用OpenGL,查验一下我电脑显卡的相关配置
- 2020年第11届蓝桥杯C/C++B组 第二轮省赛
# JJU-干干 试题A :门牌制作[问题描述]小蓝要为一条街的住户制作门牌号.这条街一共有 2020 位住户,门牌号从 1 到 2020 编号.小蓝制作门牌的方法是先制作 0 到 9 这几个数字字符 ...
- SaaS、PaaS、IaaS的区别
我们从SaaS.PaaS.IaaS的定义.工业应用以及具体案例几方面来介绍他们之间的区别 一.定义层面的区别 SaaS.PaaS.IaaS简单的说都属于云计算服务,也就是云计算+服务. 我们对于云计算 ...
- jmeter中使用csv文件时设置编码
1.新建XLS文件,另存为CSV格式文件 2.在jmeter中可以尝试将编码设置成GB2312,或者utf-8
- MySql Host is blocked because of many connection errors; unblock with 'mysqladmin flush-hosts'
错误:Host is blocked because of many connection errors; unblock with 'mysqladmin flush-hosts' 原因:同一个ip ...
- vue项目如何配置路由
vue3项目中如何配置路由 1.下载vue-router,在路由文件中引入相关依赖 import {createRouter,createWebHashHistory} from 'vue-route ...
- 数据库自动备份,crontab定时任务
查看crontab运行状态service crond status 查看当前用户的crontab,输入 crontab -l: 编辑crontab,输入 crontab -e: 删除crontab,输 ...
- 【Unity】2021接Bugly踩坑记录
写在前面 因为在工作项目中用到Bugly,所以我在自己的测试工程中尝试接入Bugly,却没有成功,明明一切是按照说明书操作,为什么会不成功?当时在网上找了很久的资料,最后试成功了,这里把当时遇到的问题 ...