parent
bd286aa447
commit
f8f33857fe
@ -0,0 +1,113 @@
|
|||||||
|
package jnpf.controller;
|
||||||
|
|
||||||
|
import com.alibaba.fastjson.JSONObject;
|
||||||
|
import io.swagger.v3.oas.annotations.Operation;
|
||||||
|
import io.swagger.v3.oas.annotations.tags.Tag;
|
||||||
|
import jnpf.base.ActionResult;
|
||||||
|
import jnpf.model.wx.WxLoginParam;
|
||||||
|
import jnpf.util.wxutil.HttpUtil;
|
||||||
|
import lombok.extern.slf4j.Slf4j;
|
||||||
|
import org.springframework.beans.factory.annotation.Value;
|
||||||
|
import org.springframework.web.bind.annotation.*;
|
||||||
|
|
||||||
|
import javax.crypto.Cipher;
|
||||||
|
import javax.crypto.spec.IvParameterSpec;
|
||||||
|
import javax.crypto.spec.SecretKeySpec;
|
||||||
|
import java.security.AlgorithmParameters;
|
||||||
|
import java.security.Key;
|
||||||
|
import java.security.Security;
|
||||||
|
import java.util.Base64;
|
||||||
|
|
||||||
|
@Slf4j
|
||||||
|
@RestController
|
||||||
|
@Tag(name = "Wexin" , description = "scm")
|
||||||
|
@RequestMapping("/api/scm/wx")
|
||||||
|
public class WxController {
|
||||||
|
|
||||||
|
@Value("${wx.huishouyuan.appid}")
|
||||||
|
private String appid;
|
||||||
|
@Value("${wx.huishouyuan.appsecret}")
|
||||||
|
private String appsecret;
|
||||||
|
@Value("${wx.code2Session}")
|
||||||
|
private String code2Session;
|
||||||
|
|
||||||
|
@Operation(summary = "小程序登录-回收员端")
|
||||||
|
@GetMapping("/hsyLogin")
|
||||||
|
public String login(@RequestParam("code") String code) {
|
||||||
|
// System.out.println("===========小程序登录-回收员端=============");
|
||||||
|
// System.out.println(appid);
|
||||||
|
// System.out.println(appsecret);
|
||||||
|
// System.out.println(code2Session);
|
||||||
|
String url = code2Session+"?appid="+appid+"&secret="+appsecret+"&js_code="+code+"&grant_type=authorization_code";
|
||||||
|
return HttpUtil.sendHttpGet(url);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Operation(summary = "小程序获取绑定的手机号-回收员端")
|
||||||
|
@PostMapping("/hsyGetPhone")
|
||||||
|
public String hsyGetPhone(@RequestBody WxLoginParam wxLoginParam) {
|
||||||
|
String url = code2Session+"?appid="+appid+"&secret="+appsecret+"&js_code="+wxLoginParam.getCode()+"&grant_type=authorization_code";
|
||||||
|
String loginResult = HttpUtil.sendHttpGet(url);
|
||||||
|
JSONObject loginResultObject = JSONObject.parseObject(loginResult);
|
||||||
|
if(null != loginResultObject.get("errcode")){
|
||||||
|
return loginResult;
|
||||||
|
}
|
||||||
|
String sessionKey = (String) loginResultObject.get("session_key");
|
||||||
|
JSONObject decrypt = decrypt(sessionKey,wxLoginParam.getEncryptedData(), wxLoginParam.getIv());
|
||||||
|
decrypt.put("sessionKey",sessionKey);
|
||||||
|
return decrypt.toString();
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 解密成json
|
||||||
|
*
|
||||||
|
* @param encryptedData
|
||||||
|
* @param iv
|
||||||
|
* @return
|
||||||
|
*/
|
||||||
|
public JSONObject decrypt(String sessionKey, String encryptedData, String iv) {
|
||||||
|
byte[] encryptedDataDecode = Base64.getDecoder().decode(encryptedData);
|
||||||
|
byte[] sessionKeyDecode = Base64.getDecoder().decode(sessionKey);
|
||||||
|
byte[] ivDecode = Base64.getDecoder().decode(iv);
|
||||||
|
Security.addProvider(new org.bouncycastle.jce.provider.BouncyCastleProvider());
|
||||||
|
byte[] decodeData = decode(encryptedDataDecode, sessionKeyDecode, ivDecode);
|
||||||
|
String stringData = new String(decodeData);
|
||||||
|
JSONObject jsonObject = JSONObject.parseObject(stringData);
|
||||||
|
return jsonObject;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 解密算法 AES-128-CBC
|
||||||
|
* 填充模式 PKCS#7
|
||||||
|
*
|
||||||
|
* @param encryptedDataDecode 目标密文
|
||||||
|
* @return
|
||||||
|
* @throws Exception
|
||||||
|
*/
|
||||||
|
private byte[] decode(byte[] encryptedDataDecode, byte[] sessionKeyDecode, byte[] iv) {
|
||||||
|
try {
|
||||||
|
Cipher cipher = Cipher.getInstance("AES/CBC/PKCS7Padding");
|
||||||
|
Key sKeySpec = new SecretKeySpec(sessionKeyDecode, "AES");
|
||||||
|
cipher.init(Cipher.DECRYPT_MODE, sKeySpec, generateIV(iv));// 初始化
|
||||||
|
byte[] result = cipher.doFinal(encryptedDataDecode);
|
||||||
|
return result;
|
||||||
|
} catch (Exception e) {
|
||||||
|
throw new RuntimeException(e);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 处理iv
|
||||||
|
*
|
||||||
|
* @param iv
|
||||||
|
* @return
|
||||||
|
* @throws Exception
|
||||||
|
*/
|
||||||
|
private AlgorithmParameters generateIV(byte[] iv) throws Exception {
|
||||||
|
AlgorithmParameters params = AlgorithmParameters.getInstance("AES");
|
||||||
|
params.init(new IvParameterSpec(iv));
|
||||||
|
return params;
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
@ -0,0 +1,10 @@
|
|||||||
|
package jnpf.model.wx;
|
||||||
|
|
||||||
|
import lombok.Data;
|
||||||
|
|
||||||
|
@Data
|
||||||
|
public class WxLoginParam {
|
||||||
|
private String code;
|
||||||
|
private String encryptedData;
|
||||||
|
private String iv;
|
||||||
|
}
|
Loading…
Reference in new issue