1。微信和支付寶第三方登錄簡介
由於微信和支付寶需要申請公司權限,才能完整使用功能,現提供上述兩種第三方登錄的個人測試過程。
1.1微信個人測試號
微信僅僅提供測試號而且該測試號是用於公衆號測試。如果需要在電腦模擬需要安裝微信web開發者工具。
微信公衆號測試賬號申請頁面:https://mp.weixin.qq.com/debug/cgi-bin/sandboxinfo?action=showinfo&t=sandbox/index
進入路徑後,微信掃碼登錄,頁面會生成用戶唯一appID和appsecret。
第三方登錄,首先必須獲取授權碼,必然要設置回調路徑,拉倒頁面下方,看到網頁賬號欄,點擊修改,然後設置你的回調地址,儘量只注入 http://主機名:端口/。不要帶上路徑,否則定死了回調路徑,比如你設置了 auth111.jiaozi.com:18003
將來你程序中可以設置爲:htttp://auth111.jiaozi.com:18003/a或者 auth111.jiaozi.com:18003/任意path,微信都支持。
我這裏就綁定auth111.jiaozi.com:18003,注意前面不用帶http://,測試這個域名可以隨便寫,端口是你回調程序端口
假設我局域網的應用的ip地址是192.168.1.100 端口是18003,爲了測試,需要在你本地host綁定一個記錄,讓auth111.jiaozi.com
指向你本地的192.168.1.100,生成環境 這個域名就必須是真是的,並且綁定到外網ip
修改C:\Windows\System32\drivers\etc\hosts
192.168.1.100 auth111.jiaozi.com
微信獲取授權碼路徑
微信內部授權(公衆號內部三方登錄)
https://open.weixin.qq.com/connect/oauth2/authorize?appid=wxf38289316bXXXXX&redirect_uri=http://auth111.jiaozi.com:18003/tpauth/code&response_type=code&scope=snsapi_userinfo&state=1#wechat_redirect
網站二維碼登錄(網站接入第三方登錄)
https://open.weixin.qq.com/connect/qrconnect?appid=wx8cf4fc48XXXXXXXXX&redirect_uri=http://open.wechat.astraea.com.au:18003/tpauth/code&response_type=code&scope=snsapi_login&state=3d6be0a4035d839573b04816624a415e#wechat_redirect
因爲開發者工具支持公衆號第三方登錄,使用第一個地址測試,參數解釋
- appid:你頁面顯示的應用id
- redirect_url:網頁授權回調路徑,域名和端口必須和測試號配置一致
- response_type:code表示使用授權碼模式認證
- scope:snsapi_userinfo:表示獲取用戶信息,snsapi_login表示僅僅登錄。
- state:表示回調路徑,傳回授權碼後,重新帶回的參數,可選。
接下來輸入正確路徑在瀏覽器測試微信內部授權路徑(必須在微信客戶端打開)
打開開發者工具,掃二維碼登錄,點擊公衆號網頁:
發現彈出二維碼,登錄後直接跳轉到了 回調路徑並且生成了code,因爲我沒開18003對應服務。所以404了
通過授權碼獲取token(測試用戶每天access_token上限2000,慎用)
https://api.weixin.qq.com/sns/oauth2/access_token?appid="+appid+"&secret="+secret+"&code="+code+"&grant_type=authorization_code"
返回格式(openid是當前用戶唯一表示):
{“success”:true,“code”:“200”,“message”:“成功”,“time”:1554870556154,“data”:"{“access_token”:“20_I3H5LMdxW3kiMTFknUaRwNdblYg_yzvJPvunezAr8G5ORKCLFWaIft5_G9k4X0kSCIOWF9SpPJM24jw4ulVncg”,“expires_in”:7200,“refresh_token”:“20_OwFPtGs9qOxrVpseyHhH6qyiW39aDE1pPiu08k1r_W37m7O-PTEue85KUJPoJrlhg4uzCNO9hJk1S4OJff6zmw”,“openid”:“oeECauNul54HXji7NoZmcKacAPcs”,“scope”:“snsapi_userinfo”}"}
注意獲取授權碼是重定向到你回調路徑,通過授權碼獲取token是rest的請求返回json。
如果你將來接入是網站接入,公衆號,app,你需要申請企業接入
企業申請路徑:https://open.weixin.qq.com/cgi-bin/applist?t=manage/list&page=0&num=20&openapptype=512&token=1dcb23ce907077ccb3daebdf4fbfe76b73e3ea11&lang=zh_CN
這裏申請了網站接入(過程不表)
查看
網站接入是上面網站二維碼登錄,獲取授權碼路徑不同,獲取token是一致。
1.2支付寶沙箱
支付寶提供沙箱賬號用於測試,獲取授權碼和api路由都是測試路徑和正式環境分開,獲取token必須使用aliyun api獲取,
傳輸數據使用了非對稱加密,雖然微信使用oauth2規範,從感覺上,aliyun更專業啊。
沙箱賬號申請:https://openhome.alipay.com/platform/appDaily.htm?tab=account
掃描二維碼登錄後
沙箱環境中,默認生了一個商家賬號和一個買家賬號,沙箱環境下你自己不能註冊也不能使用你自己的alipay賬號,只能使用商家和買家賬號
點擊左側沙箱應用進入
因爲傳輸數據需要使用自定義私鑰簽名+自定義公鑰驗證簽名,簽名的數據需要使用支付寶公鑰加密,所以你需要生成一個
自定義的公私鑰,alipay必須保留公鑰,點擊RSA2(SHA256)設置應用公鑰,
點擊查看密鑰生成,下載密鑰生成工具,生成公私鑰,將公鑰拷貝到文本框中,注意自己保留私鑰文件
保存後,點擊右側超鏈接查看支付寶公鑰,保存這個公鑰到本地
注意這裏有個支付寶網關,這個網關用於通過授權碼獲取token的入口,所以要保留,
沙箱環境是:https://openapi.alipaydev.com/gateway.do
正式環境是:https://openapi.alipay.com/gateway.do
授權回調地址與微信規則與微信一致(測試版本可以使用path正式版本一定要用http://ip:端口,不要指定path哦)
由於登錄使用二維碼,不能使用正式版的alipay只能使用沙箱版本,頁面下方掃二維碼下載
下載到手機後注意只能使用上面生成的沙箱商家和買家賬號登錄
測試獲取授權碼(沙箱是alipaydev,正式是alipay):
https://openauth.alipaydev.com/oauth2/publicAppAuthorize.htm?app_id=20160925005XXXXXX&scope=auth_user&redirect_uri=http://auth111.jiaozi.com:18003/tpauth/codeAlipay&state=init
使用沙箱alipay掃描二維碼後登錄,自動跳轉到回調地址(沒開服務)
通過code獲取授權碼,使用代碼完成了,參考自https://docs.open.alipay.com/263/105809/
@Override
public Token authCodeToToken(String code) throws ServiceException {
//你的應用私鑰文件讀取,你自己定
String appPrivate=null;
try {
appPrivate=IOUtils.toString(AlipayLogin.class.getResourceAsStream(alipayConfig.getAppPrivate()), Charset.forName("UTF-8"));
appPrivate = appPrivate.replace("-----BEGIN PRIVATE KEY-----", "");
appPrivate = appPrivate.replace("-----END PRIVATE KEY-----", "");
} catch (IOException e) {
e.printStackTrace();
}
//參數參考:https://docs.open.alipay.com/263/105809/
AlipayClient alipayClient = new DefaultAlipayClient(alipayConfig.getServiceUrl(), alipayConfig.getAppid(), appPrivate, alipayConfig.getFormat(), alipayConfig.getCharset(), alipayConfig.getAliPublic(), alipayConfig.getSignType());
AlipaySystemOauthTokenRequest request = new AlipaySystemOauthTokenRequest();
request.setCode(code);
request.setGrantType("authorization_code");
try {
AlipaySystemOauthTokenResponse oauthTokenResponse = alipayClient.execute(request);
if(oauthTokenResponse.isSuccess()) {
Token token = new Token();
//獲取token
token.setToken(oauthTokenResponse.getAccessToken());
//獲取有效期
token.setExpiresIn(Integer.parseInt(oauthTokenResponse.getExpiresIn()));
//獲取微信用戶id
token.setAppid(oauthTokenResponse.getUserId());
return token;
}else{
throw new ServiceException(oauthTokenResponse.getCode(),oauthTokenResponse.getMsg()+" "+oauthTokenResponse.getSubMsg());
}
} catch (AlipayApiException e) {
//處理異常
e.printStackTrace();
}
return null;
}
阿里正式環境必須企業申請,路徑:https://openhome.alipay.com/platform/home.htm
點擊左側應用信息查看appid,設置應用公私鑰等。