第一步交大家获取需要的参数
1:keyVersion
2:privateKeyStr(私钥要去头去尾)
3:appId
抖音获取公私钥官方文档https://developer.open-douyin.com/docs/resource/zh-CN/mini-app/develop/server/signature-algorithm具体生成地址
https://www.bejson.com/enc/rsa/
上代码获取支付参数(调用第一个方法返回给前端即可)
package com.ruoyi.system.sdk;
import com.ruoyi.common.core.domain.AjaxResult;
import java.math.BigDecimal;
import java.security.PrivateKey;
import java.security.Signature;
import java.nio.charset.StandardCharsets;
import java.util.Base64;
import java.security.KeyFactory;
import java.security.spec.PKCS8EncodedKeySpec;
import java.util.UUID;
public class DYSign {
/**
* 抖音支付获取参数
* @param appId 抖音小程序appId
* @param privateKeyStr 私钥
* @param payNotifyUrl 支付回调地址
* @param code 支付订单号(本系统生成 不是抖音)
* @param skuId 商品id(本系统生成 不是抖音)
* @param price 价格
* @param title 商品标题
* @param img 商品图片
* @param page 详情页跳转路径
* @return
*/
public static AjaxResult psyInfo(String appId,String privateKeyStr,String payNotifyUrl,String code,
String skuId, BigDecimal price, String title, String img, String page){
// 请求时间戳
long timestamp = System.currentTimeMillis()/1000L;
// 随机字符串
String nonceStr = UUID.randomUUID().toString();
// 应用公钥版本,每次重新上传公钥后需要更新,可通过「开发管理-开发设置-密钥设置」处获取
String keyVersion = "1";
// 应用私钥,用于加签 重要:1.测试时请修改为开发者自行生成的私钥;2.请勿将示例密钥用于生产环境;3.建议开发者不要将私钥文本写在代码中
// 生成好的data
System.out.println(privateKeyStr.length());
String data = String.format(
"{\"payNotifyUrl\":\"%s\",\"skuList\":[{\"skuId\":\"%s\",\"price\":%s,\"quantity\":1,\"title\":\"%s\",\"imageList\":[\"%s\"],\"type\":301,\"tagGroupId\":\"tag_group_7272625659888058380\"}],\"outOrderNo\":\"%s\",\"totalAmount\":%s,\"limitPayWayList\":[],\"payExpireSeconds\":3000,\"orderEntrySchema\":{\"path\":\"%s\"}}",
payNotifyUrl,skuId, price.multiply(new BigDecimal(100)).intValue(), title, img, code, price.multiply(new BigDecimal(100)).intValue(), page
);
String byteAuthorization = getByteAuthorization(privateKeyStr, data, appId, nonceStr, timestamp, keyVersion);
AjaxResult ajax = AjaxResult.success();
ajax.put("byteAuthorization", byteAuthorization);
ajax.put("data", data);
ajax.put("outOrderNo",code);
return ajax;
}
public static String getByteAuthorization(String privateKeyStr, String data, String appId, String nonceStr, long timestamp, String keyVersion) {
String byteAuthorization = "";
try {
// 生成签名
String signature = getSignature(privateKeyStr, "POST", "/requestOrder", timestamp, nonceStr, data);
// 构造byteAuthorization
StringBuilder sb = new StringBuilder();
sb.append("SHA256-RSA2048 ").
append("appid=").append(appId).append(",").
append("nonce_str=").append(nonceStr).append(",").
append("timestamp=").append(timestamp).append(",").
append("key_version=").append(keyVersion).append(",").
append("signature=").append(signature);
byteAuthorization = sb.toString();
} catch (Exception ex) {
ex.printStackTrace();
return "";
}
return byteAuthorization;
}
public static String getSignature(String privateKeyStr, String method, String uri, long timestamp, String nonce, String data) throws Exception {
String rawStr = method + "\n" +
uri + "\n" +
timestamp + "\n" +
nonce + "\n" +
data + "\n";
System.out.println(rawStr);
Signature sign = Signature.getInstance("SHA256withRSA");
sign.initSign(string2PrivateKey(privateKeyStr));
sign.update(rawStr.getBytes(StandardCharsets.UTF_8));
return Base64.getEncoder().encodeToString(sign.sign());
}
public static PrivateKey string2PrivateKey(String privateKeyStr) {
PrivateKey prvKey = null;
try {
byte[] privateBytes = Base64.getDecoder().decode(privateKeyStr);
PKCS8EncodedKeySpec keySpec = new PKCS8EncodedKeySpec(privateBytes);
KeyFactory keyFactory = KeyFactory.getInstance("RSA");
prvKey = keyFactory.generatePrivate(keySpec);
} catch (Exception ex) {
ex.printStackTrace();
}
return prvKey;
}
}
查询支付状态
第一步引入maven
<!--不要使用1.0.0 有问题-->
<dependency>
<groupId>com.douyin.openapi</groupId>
<artifactId>sdk</artifactId>
<version>1.0.1</version>
</dependency>
基本流程
init(sdk初始化) -> 获取accessToken-> 调用查询接口
/**
* 初始化
* @return
*/
public Client init(){
try{
Config config = new Config()
.setClientKey(APP_ID)
.setClientSecret(APP_SECRET); // 改成自己的app_id跟secret
return new Client(config);
}catch (Exception e){
return null;
}
}
/**
* 获取access_token
* @param appId
* @param secret
* @return
*/
public String getAccessToken(String appId, String secret){
try {
Client client = init();
OauthClientTokenRequest sdkRequest = new OauthClientTokenRequest();
sdkRequest.setClientKey(appId);
sdkRequest.setClientSecret(secret);
sdkRequest.setGrantType("client_credential");
OauthClientTokenResponse sdkResponse = client.OauthClientToken(sdkRequest);
return sdkResponse.getData().getAccessToken();
} catch (TeaException e) {
System.out.println(e.getMessage());
} catch (Exception e) {
System.out.println(e.getMessage());
}
return null;
}
/**
* 根据创建订单生成的订单号查询
* @param outTradeNo
* @return
*/
public DeveloperOrderQueryResponse queryDouYinPay(String outTradeNo){
try {
Client client = init();
String accessToken = getAccessToken(APP_ID, APP_SECRET);
DeveloperOrderQueryRequest sdkRequest = new DeveloperOrderQueryRequest();
sdkRequest.setAccessToken(accessToken);
sdkRequest.setOutOrderNo(outTradeNo);
DeveloperOrderQueryResponse sdkResponse = client.DeveloperOrderQuery(sdkRequest);
System.out.println(sdkResponse);
return sdkResponse;
} catch (TeaException e) {
System.out.println(e.getMessage());
} catch (Exception e) {
System.out.println(e.getMessage());
}
return null;
}
今天的分享就到这了,希望我的文档能帮助到各位