微信-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 ...
随机推荐
- Java中File类
File类是java.io包中唯一代表磁盘文件本身的对象.File类的对象主要用来获取文件本身的一些信息,如文件所在目录.文件长度.读写权限等. 一. 文件的创建与删除 通常使用以下三种方法来创建一个 ...
- “jupyter notebook 不能导入python库但是终端上可以实现”的问题的解决
在使用jupyter notebook的过程中,创建了一个新的环境(anaconda中env)后遇到了这样一个问题,就是: 在jupyter notebook上运行程序,中间发现有一个python库未 ...
- Liunx mosquitto卸载
1.查询文件: whereis mosquitto whereis mosquitto_sub 2.删除查询到的文件,命令: rm -rf /etc/mosquitto rm -f /usr/loca ...
- python:包含’e’和‘-’的 str 转 float
from functools import reduce def str2float(s): s = s.split('.') a = s[0] b = s[1] if a[0] == '-': a ...
- 微信点击链接:debugx5.qq.com提示您使用的不是x5内核
微信点击链接:debugx5.qq.com提示您使用的不是x5内核 因为要测试小程序,需要webview调试功能,正常来说在微信任意一个聊天窗口,输入:debugx5.qq.com,点击该链接就可以, ...
- 2、Java程序设计环境
1.JDK Java开发工具箱 在Java 9之前,有32位和64位两个版本的Java开发工具包.现在Oracle公司不在开发32位版本,要使用Oracle JDK,你需要有一个64位的操作系统. 安 ...
- net-snmp 自定义OID利用脚本获取值
两种办法: 1)pass方式 /etc/snmp/snmpd.conf 写脚本 脚本需要注意:要连续输出三行:1.OID 2.类型 3.值 如果不按照这个规定,直接输出值,将会报错. 检查 第二种方法 ...
- 解决spring boot 2.6.4版本循环依赖问题
引用spring boot 2.6.4 版本 报循环依赖错误 *************************** APPLICATION FAILED TO START ************* ...
- 12.14linux学习第十七天
今天老刘收了下第13章尾巴,讲了第14章和第15章. 13.6 分离解析技术 现在,喜欢看我们这本<Linux就该这么学>的海外读者越来越多,如果继续把本书配套的网站服务器(https:/ ...
- NODEJS的误打误撞
我接触nodejs 纯属是误打误撞,之前在做一个房地产项目的时候,客户提出了一个需求,我大概整理一些"我们需要员工只能在公司登陆房管系统并进行操作,回家是不允许进行登录的",其实对 ...