前置條件
-
獲取appId
-
新增獲取會員資訊功能列表
步驟 :開發管理 -> 功能列表 -> 新增功能 -> 勾選會員資訊 ->確認,效果如圖:- 注意 :如果想獲取手機號與姓名等真實資訊,需要額外申請敏感資訊流程
-
設定金鑰
- 使用阿里的金鑰生成工具生成私金鑰。
- 上傳應用公鑰生成支付寶公鑰
- 登入開放者平臺 -- 檢視選擇自己的小程式 -- 設定 -- 開發設定 -- 介面加簽方式 -- 設定應用公鑰 -- 設定應用公鑰 -- 把加簽工具裡的"公鑰"內容複製貼上進去,點選儲存。效果檢視:
- 公鑰用於簽證使用
服務端
- 在專案中的pom檔案中加入以下依賴:
- 在application.yml中新增appId,公鑰,私鑰的配置。
-
注意 :公鑰不是工具裡的公鑰內容,而是通過公鑰生成的支付寶公鑰內容
- 新增讀取配置檔案java工具類 AliXcxProperty.java
@Data
@Component
@ConfigurationProperties(prefix = "alipaytest.ali.xcx")
public class AliXcxProperty {
private String serverUrl;
private String appId;
private String privateKey;
private String publicKey;
}
複製程式碼
- AliAuthController.java
@Controller
public class AliAuthController {
@Autowired
private AliAuthService aliAuthService;
@GetMapping("/auth")
@ResponseBody
public AlipayUserInfoShareResponse auth(@RequestParam(value="authCode") String authCode){
System.out.println(authCode);
AlipayUserInfoShareResponse auth = aliAuthService.auth(authCode);
return auth;
}
}
複製程式碼
- AliAuthService.java
@Slf4j
@Service
public class AliAuthService {
@Resource
private AliXcxProperty aliXcxProperty;
public AlipayUserInfoShareResponse auth(String authcode) {
AlipayClient alipayClient = new DefaultAlipayClient(aliXcxProperty.getServerUrl(),
aliXcxProperty.getAppId(),
aliXcxProperty.getPrivateKey(),
"JSON", "utf-8", aliXcxProperty.getPublicKey(), "RSA2");
//獲取uid&token
AlipaySystemOauthTokenRequest request = new AlipaySystemOauthTokenRequest();
request.setGrantType("authorization_code");//值為authorization_code時,代表用code換取;值為refresh_token時,代表用refresh_token換取
request.setCode(authcode);
try {
AlipaySystemOauthTokenResponse response = alipayClient.execute(request);
if (response.isSuccess()) {
log.info("auth success [{}]", JSONObject.toJSONString(response));
AlipayUserInfoShareRequest alipayUserInfoShareRequest = new AlipayUserInfoShareRequest();
AlipayUserInfoShareResponse alipayUserInfoShareResponse = alipayClient.execute(alipayUserInfoShareRequest, response.getAccessToken());
if (alipayUserInfoShareResponse.isSuccess()) {
log.info("AlipayUserInfoShareResponse success [{}]", JSONObject.toJSONString(alipayUserInfoShareResponse));
} else {
log.info("AlipayUserInfoShareResponse fail [{}]", JSONObject.toJSONString(alipayUserInfoShareResponse));
}
return alipayUserInfoShareResponse;
} else {
log.info("auth fail [{}]", JSONObject.toJSONString(response));
}
} catch (AlipayApiException e) {
log.error("auth exception", e);
}
return null;
}
}
複製程式碼
- 服務端授權程式碼完畢,釋出即可
客戶端
- info.axml
- info.js
const app = getApp();
Page({
data: {
userInfo:{}, //存放使用者資訊
userLogin:false, //判斷當前是否登入
userNotLogin:true //判斷當前是否登入
},
onLoad() {
var me = this;
var userInfo = app.getGlobalUserInfo(); //在全域性快取中獲取使用者資訊
if(userInfo!=null&&userInfo!=undefined){ //有則不發起授權登入
me.setData({
userInfo:userInfo,
userLogin:true,
userNotLogin:false
})
return;
}
//無快取則發起授權登入,第一步先通過小程式api獲取授權碼authCode
my.getAuthCode({
scopes:"auth_user",
success: (res) => {
if(res!=null&&res!=undefined){
console.log(res.authCode);
//第一步成功則呼叫後端介面,並傳入authCode
my.request({
url:app.myServerUrl+"/auth?authCode="+res.authCode,
success(res){
console.log(res.data);
//成功則賦值到data資料域
me.setData({
userInfo : res.data,
userLogin:true,
userNotLogin:false,
})
//存入到快取中
app.setGlobalUserInfo(res.data);
},
})
}
},
});
},
login(){
this.onLoad();
},
});
複製程式碼
- app.js
App({
myServerUrl:"https://app2134991587test.mapp-test.xyz", //線上雲服務端的地址
localhostServerUrl:"http://127.0.0.1:8080", //本地springboot開啟內嵌的tomcat的地址,用於本地測試。
//從本地快取中獲取全域性的使用者物件
getGlobalUserInfo(){
var golbalUserInfo = my.getStorageSync({
key: 'globalUserInfo', // 快取資料的key
}).data;
return golbalUserInfo;
},
setGlobalUserInfo(golbalUserInfo){
my.setStorageSync({
key: 'globalUserInfo', // 快取資料的key
data: golbalUserInfo, // 要快取的資料
});
},
});
複製程式碼
-
測試結果如下 :
-
下次再次進入不會彈框授權,如有需要,將使用者授權資訊刪除掉即可,如下: