下面的代码保存为get_sdkper.php
<?php
require_once "jssdk.php"
//1.注意:所有的JS接口只能在公众号绑定的域名下调用,公众号开发者需要先登录微信公众平台进入“公众号设置”的“功能设置”里填写“JS接口安全域名”。
//2.填写appid和secret
$appid="你的appid"
$secret="你的secret"
$getUrl=$_POST["url"]
$jssdk = new JSSDK($appid, $secret,$getUrl)
$signPackage = $jssdk->GetSignPackage()
echo("{\"appId\":\"".$signPackage["appId"]."\",\"timestamp\":\"".$signPackage["timestamp"]."\",\"nonceStr\":\"".$signPackage["nonceStr"]."\",\"signature\":\"".$signPackage["signature"]."\",\"url\":\"".$signPackage["url"]."\"}")
?>
下面是调用方法:
//调用微信JS API接口
var GetappId="",Gettimestamp="",GetnonceStr="",Getsignature=""
function CallWechatJSAPI()
{
$.ajax({
url:"get_sdkper.php",
type:"POST",
data:"url="+escape(location.href.split('#')[0]),
dataType:"JSON",
success:function(result){
var resultData = $.evalJSON(result)
if(resultData){
GetappId = resultData.appId
Gettimestamp = resultData.timestamp
GetnonceStr = resultData.nonceStr
Getsignature = resultData.signature
wx.config({
debug: false,
appId: GetappId,
timestamp: Gettimestamp,
nonceStr: GetnonceStr,
signature: Getsignature,
jsApiList: [
'checkJsApi',
'onMenuShareTimeline',
'onMenuShareQQ',
'onMenuShareWeibo',
'hideMenuItems',
'hideAllNonBaseMenuItem',
'chooseImage',
'previewImage',
'uploadImage',
'downloadImage',
'getNetworkType',
'openLocation',
'getLocation',
'hideOptionMenu',
'closeWindow',
'scanQRCode',
'chooseWXPay',
'openProductSpecificView',
'addCard',
'chooseCard',
'openCard'
]
})
}
},
error:function(){
//alert("连接网络失败,请重试。")
}
})
}
有以下限制,1.必须在微信打开2.微信页面授权其中第一步比较容易实现,修改下ua(user-agent),让其携带“MicroMessenger”字段即可。第二部则是由于微信浏览器内置一些js库,在其他浏览器是无内置的,所以在chrome网页授权基本是无效的。不过可以用其他办法略过授权。解决方案:1、是伪装微信浏览器,使其绕过微信验证,2、获取cookie,跳过授权验证。2、 准备工具1.chrome,主要是用于修改user-agent.2.fiddler抓包工具(安装正式抓取https包)一,修改UA打开Chrome浏览器,按下F12进入手机调试模式选择Edit点击Add custom device输入ua,UA通过fiddler抓包获取我的 User-Agent是: Mozilla/5.0 (LinuxAndroid 6.0vivo Y67A Build/MRA58Kwv) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/53.0.2785.49 Mobile MQQBrowser/6.2 TBS/043508 Safari/537.36 MicroMessenger/6.5.13.1100 NetType/WIFI Language/zh_CN可以直接使用这个UA,也可以抓取自己的ua第二步,添加cookiefiddler抓取cookie在console下面输入 document.cookie=“(cookie通过抓包获取)”,后回车打开Chrome可以看到,我添加的cookie成功chrome打开地址,不会报错啦通过 微信公众平台---->权限接口 可以得知 微信的订阅号是没有授权登录接口的,只有服务号才有该权限。这点微信公众平台在多处反复强调最终的事实是:微信订阅号是可以实现授权登录的!
二:具体实现步骤:
1. 首先在 微信公众平台(https://mp.weixin.qq.com/) 【开发】---->【基本配置】----->【服务器配置】完成基本的配置信息
URL: 这里的地址我写的是我们HTML5项目的某个Controller或Servlet的地址,例如 http://www.example.com/weixin/checkSignature.do
注意这个CheckSignatureController中是要写代码的,代码的业务逻辑是要验证签名并返回echostr字段;还需要注意www.example.com 这个地址必须是外网地址(内网不行的), 因为当你配置完所有的基本信息时,当提交的时候,微信公众平台会回答你刚才填的URL地址即http://www.example.com/weixin/checkSignature.do, 如果你填内网的地址,那么这个URL调不到,如果签名验证不过去,这个基本配置就配置不成功。当你写好这个CheckSignatureController后,还要将代码放到测试环境中去,以便微信公众平台可以回调你这个Controller
[java] view plain copy
@Controller
@RequestMapping(value="/weixin")
public class CheckSignatureController extends BaseController {
private static transient final Logger log = LoggerFactory.getLogger(CheckSignatureController.class)
public static String WEIXIN_TOKEN = "Token"
@RequestMapping(value ="checkSignature.do", produces = "application/jsoncharset=utf-8")
@ResponseBody
public String checkSignature(HttpServletRequest request) {
String echostr = request.getParameter("echostr") // 随机字符串
if (isSignature(request)) {
return echostr
}
return null
}
// 检查签名
public boolean isSignature(HttpServletRequest request) {
String signature = request.getParameter("signature") // 微信加密签名
String timestamp = request.getParameter("timestamp") // 时间戳
String nonce = request.getParameter("nonce") // 随机数
String[] arr = new String[] {timestamp, nonce, WEIXIN_TOKEN}
Arrays.sort(arr)
String s = arr[0] + arr[1] + arr[2]
MessageDigest md
byte[] digest = null
try {
md = MessageDigest.getInstance("SHA-1")
digest = md.digest(s.getBytes("utf-8"))
} catch (Exception e) {
e.printStackTrace()
}
String sign = bytesToHexString(digest)
return signature.equals(sign)
}
public static final String bytesToHexString(byte[] bArray) {
StringBuffer sb = new StringBuffer(bArray.length)
String sTemp
for (int i = 0i <bArray.lengthi++) {
sTemp = Integer.toHexString(0xFF &bArray[i])
if (sTemp.length() <2)
sb.append(0)
sb.append(sTemp.toUpperCase())
}
return sb.toString().toLowerCase()
}
}
当你点击基本信息的【提交】按钮时,微信公众平台会向你项目发送http请求:
http://www.example.com/weixin/checkSignature.do?signature=d96625be6855baa013e6c66cb9155dd38ed8deb5&echostr=8312595572152199567&timestamp=1460511115&nonce=534926942
如果这个地址能返回http请求中的echostr参数,就能提交成功,否则提交还会提示报错
Token:是一个字符串,自己随意写,但是要保证一点CheckSignatureController中会用到Token这个值,两者要保证完全一致即可
EncodingAESKey: 我选择的是随机生成的
2: 测试号管理
登录这个地址,进行配置:http://mp.weixin.qq.com/debug/cgi-bin/sandboxinfo?action=showinfo&t=sandbox/index
在这个地址中要配置完所有信息
接口配置信息
URL: http://www.example.com/weixin/checkSignature.do 和基本信息配置一样
Token:和基本配置中的token保持一致
JS接口安全域名
域名:http://www.example.com