微信公众平台开发,oauth2.0认证地址,打开jssdk页面无法验证通过

JavaScript024

微信公众平台开发,oauth2.0认证地址,打开jssdk页面无法验证通过,第1张

给你个PHP的例子:

下面的代码保存为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