IDEA基於支付寶小程式之授權篇

xiaokuli發表於2019-05-04

前置條件

  • 獲取appId

    IDEA基於支付寶小程式之授權篇
    IDEA基於支付寶小程式之授權篇

  • 新增獲取會員資訊功能列表
    步驟 :開發管理 -> 功能列表 -> 新增功能 -> 勾選會員資訊 ->確認,效果如圖:

    IDEA基於支付寶小程式之授權篇

    • 注意 :如果想獲取手機號與姓名等真實資訊,需要額外申請敏感資訊流程
  • 設定金鑰

    • 使用阿里的金鑰生成工具生成私金鑰。
      IDEA基於支付寶小程式之授權篇
    • 上傳應用公鑰生成支付寶公鑰
      • 登入開放者平臺 -- 檢視選擇自己的小程式 -- 設定 -- 開發設定 -- 介面加簽方式 -- 設定應用公鑰 -- 設定應用公鑰 -- 把加簽工具裡的"公鑰"內容複製貼上進去,點選儲存。效果檢視:
        IDEA基於支付寶小程式之授權篇
        IDEA基於支付寶小程式之授權篇
        IDEA基於支付寶小程式之授權篇
        IDEA基於支付寶小程式之授權篇
      • 公鑰用於簽證使用

服務端

  • 在專案中的pom檔案中加入以下依賴:
    IDEA基於支付寶小程式之授權篇
  • 在application.yml中新增appId,公鑰,私鑰的配置。
    IDEA基於支付寶小程式之授權篇
  • 注意 :公鑰不是工具裡的公鑰內容,而是通過公鑰生成的支付寶公鑰內容

  • 新增讀取配置檔案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
    IDEA基於支付寶小程式之授權篇
  • 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, // 要快取的資料
    });
  },
});
複製程式碼
  • 測試結果如下 :

    IDEA基於支付寶小程式之授權篇
    IDEA基於支付寶小程式之授權篇
    IDEA基於支付寶小程式之授權篇

  • 下次再次進入不會彈框授權,如有需要,將使用者授權資訊刪除掉即可,如下:

    IDEA基於支付寶小程式之授權篇
    IDEA基於支付寶小程式之授權篇
    IDEA基於支付寶小程式之授權篇

以上就是支付寶小程式授權的部分,如果錯誤,請在評論區指出,蟹蟹大家的觀看!

相關文章