⽤户绑定java实例_第三⽅⽹站登录java代码实现前两个星期在公司中的项⽬加上了登录、绑定的功能,在这⾥做个记录!
⼀、开发前知识
1、开放平台与公众平台的区别
1.1 公众平台:
② 公众平台⾯向的是普通的⽤户,⽐如⾃媒体和媒体,企业官⽅公众账号运营⼈员使⽤,当然你所在的团队或者公司有实⼒去开发⼀些内容,也可以调⽤公众平台⾥⾯的接⼝,⽐如⾃定义菜单,⾃动回复,查询功能。
1.2 开放平台:
开放平台:⾯向的是开发者和第三⽅独⽴软件开发商。开放平台的⽂档似乎包含了开放平台⽂档⾥⾯的接⼝。
2、公众平台⽬前只⽀持80端⼝,且项⽬上传到服务器上⾯不容易debug啊?
解决⽅法:ngrok ⼯具,可以根据本地项⽬映射成外⽹可以访问的地址、端⼝,默认映射为80端⼝。
存在问题: 每次重启,域名会变化,都需要项⽬中、公众平台配置,付费可以固定域名。。。
使⽤⽅法: ① 注册后获得⼀个授权码,下载 ngrok
② 》CMD 进⼊ ngrok ⽬录
》ngrok authtoken 授权码
》ngrok http 8080
③看到这个页⾯,ngrok就为你分配了临时访问通道成功了^^
⼆、配置
(每个号可以申请成为开发者测试账号进⾏功能开发的。)
1、在公众平台中进⾏配置:
①:配置“接⼝配置信息” (Token 在项⽬中我是配置为"handsomeKing",没错,我就是King ^^)
url 改为⾃⼰映射的域名
② 配置“功能服务” 的 “⽹页帐号”。注意,是域名
好了,可以愉快的coding 了
三、可以开发啦
1、上⾯的 “接⼝配置信息” 配置得 wechat/ownerCheck ⽅法是验证 这个url 为我⾃⼰的,handsomeKing 就是这个⽅法中的⼀个参数。这个⼩朋友会⽤Get⽅法带上4个参数给我服务器: signature(签名)、timestamp(时间戳)、nonce(随机数)、echostr(随机字符串),再加上咱们项⽬中⾃⼰配置的 token ,通过检验signature对请求进⾏校验,若校验成功则原样返回echostr,表⽰接⼊成功,否则接⼊失败:(talk is cheap, show me the code *&)
/**
* 消息接收和token验证
* @param model
* @param request
* @param response
* @throws IOException
*/
@RequestMapping("/ownerCheck")
public void ownerCheck(Model model, HttpServletRequest request,HttpServletResponse response) throws IOException { System.out.println(111);
boolean isGet = Method().toLowerCase().equals("get");
PrintWriter print;
if (isGet) {
// 加密签名
String signature = Parameter("signature");
// 时间戳
String timestamp = Parameter("timestamp");
// 随机数
String nonce = Parameter("nonce");
// 随机字符串
String echostr = Parameter("echostr");
// 通过检验signature对请求进⾏校验,若校验成功则原样返回echostr,表⽰接⼊成功,否则接⼊失败
if (signature != null && CheckoutUtil.checkSignature(signature, timestamp, nonce)) {
try {
print = Writer();
print.write(echostr);
print.flush();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException;
public class CheckoutUtil {
// 与接⼝配置信息中的Token要⼀致
private static String token = "handsomeKing";
/**
* @param signature
* @param timestamp
* @param nonce
* @return
*/
public static boolean checkSignature(String signature, String timestamp, String nonce) { String[] arr = new String[] { token, timestamp, nonce };
// 将token、timestamp、nonce三个参数进⾏字典序排序
// Arrays.sort(arr);
sort(arr);
StringBuilder content = new StringBuilder();
for (int i = 0; i < arr.length; i++) {
content.append(arr[i]);
}
MessageDigest md = null;
String tmpStr = null;
try {
md = Instance("SHA-1");
// 将三个参数字符串拼接成⼀个字符串进⾏sha1加密
byte[] digest = md.String().getBytes());
tmpStr = byteToStr(digest);
} catch (NoSuchAlgorithmException e) {
e.printStackTrace();
}
content = null;
// 将sha1加密后的字符串可与signature对⽐,标识该请求来源于
return tmpStr != null ? tmpStr.UpperCase()) : false;
}
/**
* 将字节数组转换为⼗六进制字符串
*
* @param byteArray
private static String byteToStr(byte[] byteArray) {
String strDigest = "";
for (int i = 0; i < byteArray.length; i++) {
strDigest += byteToHexStr(byteArray[i]);
}
return strDigest;
}
/**
* 将字节转换为⼗六进制字符串
*
* @param mByte
* @return
*/
private static String byteToHexStr(byte mByte) {
char[] Digit = { '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'A', 'B', 'C', 'D', 'E', 'F' }; char[] tempArr = new char[2];
tempArr[0] = Digit[(mByte >>> 4) & 0X0F];
tempArr[1] = Digit[mByte & 0X0F];
String s = new String(tempArr);
return s;
}
public static void sort(String a[]) {
for (int i = 0; i < a.length - 1; i++) {
for (int j = i + 1; j < a.length; j++) {
if (a[j]pareTo(a[i]) < 0) {
String temp = a[i];
a[i] = a[j];
a[j] = temp;
}
}
}
}
}
2、⽤户⽤户同意授权,获取服务器传过来的俩参数: code、state。其中:
APPID: 开发者测试账号
REDIRECT_URI: 同意授权后跳转的 URL
/
**
* 第⼀步:⽤户同意授权,获取code(引导关注者打开如下页⾯:)
* 获取 code、state
*/
public static String getStartURLToGetCode() {
String takenUrl = "open.weixin.qq/connect/oauth2/authorize?
appid=APPID&redirect_uri=REDIRECT_URI&response_type=code&scope=SCOPE&state=STATE#wechat_redirect"; takenUrl= place("APPID", Param.APPID);
takenUrl= place("REDIRECT_URI", de(Param.REDIRECT_URI));
//FIXME : snsapi_userinfo
takenUrl= place("SCOPE", "snsapi_userinfo");
System.out.println(takenUrl);
return takenUrl;
}
3、获取⽤户的 access_token、openid
APPID:开发者测试账号
secret:开发者测试账号密码
code::上⼀步的 code
/**
* 获取access_token、openid
* 第⼆步:通过code获取access_token
* @param code url = "api.weixin.qq/sns/oauth2/access_token
* ?appid=APPID
* &secret=SECRET
java源代码加密* &code=CODE
* &grant_type=authorization_code"
* */
public static OAuthInfo getAccess_token(String code){
String authUrl = "api.weixin.qq/sns/oauth2/access_token?
appid=APPID&secret=SECRET&code=CODE&grant_type=authorization_code ";
authUrl= place("APPID", Param.APPID);