parent
3c33f9688b
commit
21ced08f55
@ -0,0 +1,11 @@
|
|||||||
|
package au.com.royalpay.payment.manage.support.serverless;
|
||||||
|
|
||||||
|
import com.alibaba.fastjson.JSONObject;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Create by davep at 2019-08-08 15:56
|
||||||
|
*/
|
||||||
|
public interface ServerlessFunctionTrigger {
|
||||||
|
|
||||||
|
JSONObject triggerFunction(String function,JSONObject params);
|
||||||
|
}
|
@ -0,0 +1,63 @@
|
|||||||
|
package au.com.royalpay.payment.manage.support.serverless.qcloud;
|
||||||
|
|
||||||
|
import au.com.royalpay.payment.manage.support.serverless.ServerlessFunctionTrigger;
|
||||||
|
import au.com.royalpay.payment.manage.support.serverless.qcloud.support.ServerLessFunctionInvokeRequest;
|
||||||
|
import au.com.royalpay.payment.tools.exceptions.ServerErrorException;
|
||||||
|
import com.alibaba.fastjson.JSON;
|
||||||
|
import com.alibaba.fastjson.JSONObject;
|
||||||
|
import org.apache.commons.lang3.StringUtils;
|
||||||
|
import org.slf4j.Logger;
|
||||||
|
import org.slf4j.LoggerFactory;
|
||||||
|
import org.springframework.beans.factory.annotation.Value;
|
||||||
|
import org.springframework.boot.web.client.RestTemplateBuilder;
|
||||||
|
import org.springframework.http.ResponseEntity;
|
||||||
|
import org.springframework.http.converter.StringHttpMessageConverter;
|
||||||
|
import org.springframework.stereotype.Service;
|
||||||
|
import org.springframework.web.client.RestTemplate;
|
||||||
|
|
||||||
|
import java.nio.charset.StandardCharsets;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Create by davep at 2019-08-12 9:31
|
||||||
|
*/
|
||||||
|
@Service
|
||||||
|
public class QCloudServerlessTrigger implements ServerlessFunctionTrigger {
|
||||||
|
private Logger logger = LoggerFactory.getLogger(getClass());
|
||||||
|
private RestTemplate restTemplate;
|
||||||
|
private String secretId;
|
||||||
|
private String secretKey;
|
||||||
|
private String region;
|
||||||
|
|
||||||
|
public QCloudServerlessTrigger(@Value("${qcloud.secret-id}") String secretId,
|
||||||
|
@Value("${qcloud.secret-key}") String secretKey,
|
||||||
|
@Value("${qcloud.scf.region}") String region) {
|
||||||
|
this.secretId = secretId;
|
||||||
|
this.secretKey = secretKey;
|
||||||
|
this.region = region;
|
||||||
|
this.restTemplate = new RestTemplateBuilder()
|
||||||
|
.messageConverters(new StringHttpMessageConverter(StandardCharsets.UTF_8))
|
||||||
|
.build();
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public JSONObject triggerFunction(String function, JSONObject params) {
|
||||||
|
ServerLessFunctionInvokeRequest request = new ServerLessFunctionInvokeRequest(secretId, secretKey, region, function, params);
|
||||||
|
ResponseEntity<String> resp = restTemplate.exchange(request.request(), String.class);
|
||||||
|
JSONObject data = JSON.parseObject(resp.getBody());
|
||||||
|
JSONObject response = data.getJSONObject("Response");
|
||||||
|
String requestId = response.getString("RequestId");
|
||||||
|
JSONObject result = response.getJSONObject("Result");
|
||||||
|
int invokeResult = result.getIntValue("InvokeResult");
|
||||||
|
if (invokeResult != 0) {
|
||||||
|
String errMsg = result.getString("ErrMsg");
|
||||||
|
logger.error("Invoking function [{}] failed,request id={},invoke result={},errMsg={}", function, requestId, invokeResult, errMsg);
|
||||||
|
throw new ServerErrorException("Invoke function " + function + " failed:[" + errMsg + "]");
|
||||||
|
} else {
|
||||||
|
String retMsg = result.getString("RetMsg");
|
||||||
|
return StringUtils.isNotEmpty(retMsg) ? JSON.parseObject(retMsg) : null;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
}
|
@ -0,0 +1,62 @@
|
|||||||
|
package au.com.royalpay.payment.manage.support.serverless.qcloud.support;
|
||||||
|
|
||||||
|
import com.alibaba.fastjson.JSONObject;
|
||||||
|
import org.springframework.http.HttpMethod;
|
||||||
|
import org.springframework.util.MimeTypeUtils;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Create by davep at 2019-08-12 17:13
|
||||||
|
*/
|
||||||
|
public class ServerLessFunctionInvokeRequest extends QCloudV3Request {
|
||||||
|
private final String functionName;
|
||||||
|
private final JSONObject clientContext;
|
||||||
|
|
||||||
|
public ServerLessFunctionInvokeRequest(String secretId, String secretKey, String region, String functionName, JSONObject clientContext) {
|
||||||
|
super(secretId, secretKey, region);
|
||||||
|
this.functionName = functionName;
|
||||||
|
this.clientContext = clientContext == null ? new JSONObject() : clientContext;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
protected String host() {
|
||||||
|
return "scf.tencentcloudapi.com";
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
protected String uri() {
|
||||||
|
return "/";
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
protected HttpMethod method() {
|
||||||
|
return HttpMethod.POST;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
protected String action() {
|
||||||
|
return "Invoke";
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
protected String version() {
|
||||||
|
return "2018-04-16";
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
protected String contentType() {
|
||||||
|
return MimeTypeUtils.APPLICATION_JSON_VALUE;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
protected String requestPayload() {
|
||||||
|
JSONObject data = new JSONObject();
|
||||||
|
data.put("FunctionName", functionName);
|
||||||
|
data.put("ClientContext", clientContext.toJSONString());
|
||||||
|
return data.toJSONString();
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
protected String queryStringParams() {
|
||||||
|
return "";
|
||||||
|
}
|
||||||
|
}
|
@ -0,0 +1,81 @@
|
|||||||
|
package au.com.royalpay.payment.manage.valid;
|
||||||
|
|
||||||
|
import au.com.royalpay.payment.manage.support.serverless.qcloud.support.ServerLessFunctionInvokeRequest;
|
||||||
|
import com.alibaba.fastjson.JSON;
|
||||||
|
import com.alibaba.fastjson.JSONObject;
|
||||||
|
import org.apache.commons.lang3.RandomUtils;
|
||||||
|
import org.apache.commons.lang3.StringUtils;
|
||||||
|
import org.apache.commons.net.util.Base64;
|
||||||
|
import org.junit.Test;
|
||||||
|
import org.springframework.boot.web.client.RestTemplateBuilder;
|
||||||
|
import org.springframework.http.ResponseEntity;
|
||||||
|
import org.springframework.http.converter.StringHttpMessageConverter;
|
||||||
|
import org.springframework.web.client.RestTemplate;
|
||||||
|
import org.springframework.web.util.UriComponentsBuilder;
|
||||||
|
|
||||||
|
import javax.crypto.Mac;
|
||||||
|
import javax.crypto.spec.SecretKeySpec;
|
||||||
|
import java.nio.charset.StandardCharsets;
|
||||||
|
import java.security.InvalidKeyException;
|
||||||
|
import java.security.NoSuchAlgorithmException;
|
||||||
|
import java.util.Arrays;
|
||||||
|
import java.util.HashMap;
|
||||||
|
import java.util.Map;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Create by davep at 2019-08-08 16:21
|
||||||
|
*/
|
||||||
|
public class QCloudSignTest {
|
||||||
|
|
||||||
|
private String function = "export_merchants";
|
||||||
|
private String region = "ap-hongkong";
|
||||||
|
private String secretId = "AKIDlHdjgWzZliPvBauZFfrnW0MaZOyHdTPz";
|
||||||
|
private String secretKey = "YswoQDsIZfWEqEAEvMXS8Yic84lFn9Jp";
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void printUrl() throws NoSuchAlgorithmException, InvalidKeyException {
|
||||||
|
String host = "scf.tencentcloudapi.com/";
|
||||||
|
String method = "GET";
|
||||||
|
Map<String, String> paramsMap = new HashMap<>();
|
||||||
|
paramsMap.put("Action", "Invoke");
|
||||||
|
paramsMap.put("Version", "2018-04-16");
|
||||||
|
paramsMap.put("Region", region);
|
||||||
|
paramsMap.put("FunctionName", function);
|
||||||
|
paramsMap.put("ClientContext", "{\"client_moniker\":\"PINE\"}");
|
||||||
|
paramsMap.put("Nonce", "" + RandomUtils.nextInt(0, 999999));
|
||||||
|
paramsMap.put("Timestamp", "" + System.currentTimeMillis() / 1000);
|
||||||
|
paramsMap.put("SignatureMethod", "HmacSHA256");
|
||||||
|
paramsMap.put("SecretId", secretId);
|
||||||
|
|
||||||
|
String[] params = paramsMap.entrySet().stream().map(entry -> entry.getKey() + "=" + entry.getValue()).toArray(String[]::new);
|
||||||
|
|
||||||
|
Arrays.sort(params);
|
||||||
|
String base = method + host + "?" + StringUtils.join(params, "&");
|
||||||
|
String key = secretKey;
|
||||||
|
|
||||||
|
Mac sha256HMAC = Mac.getInstance("HmacSHA256");
|
||||||
|
SecretKeySpec secretKey = new SecretKeySpec(key.getBytes(), "HmacSHA256");
|
||||||
|
sha256HMAC.init(secretKey);
|
||||||
|
byte[] finalBytes = sha256HMAC.doFinal(base.getBytes());
|
||||||
|
String sign = Base64.encodeBase64String(finalBytes);
|
||||||
|
paramsMap.put("Signature", sign);
|
||||||
|
UriComponentsBuilder builder = UriComponentsBuilder.fromHttpUrl("https://" + host);
|
||||||
|
for (Map.Entry<String, String> entry : paramsMap.entrySet()) {
|
||||||
|
builder.queryParam(entry.getKey(), entry.getValue());
|
||||||
|
}
|
||||||
|
System.out.println(builder.build(false).encode().toUriString());
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void v3Test() {
|
||||||
|
RestTemplate restTemplate = new RestTemplateBuilder()
|
||||||
|
.messageConverters(new StringHttpMessageConverter(StandardCharsets.UTF_8))
|
||||||
|
.build();
|
||||||
|
JSONObject params = new JSONObject();
|
||||||
|
params.put("client_moniker", "PINE");
|
||||||
|
ServerLessFunctionInvokeRequest request = new ServerLessFunctionInvokeRequest(secretId, secretKey, region, function, params);
|
||||||
|
ResponseEntity<String> resp = restTemplate.exchange(request.request(), String.class);
|
||||||
|
System.out.println(resp.getBody());
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
Loading…
Reference in new issue