JAVA抖音支付获取参数/查询支付状态

抖音获取支付参数官方文档https://developer.open-douyin.com/docs/resource/zh-CN/mini-app/develop/server/payment/trade-system/general/order/request-order-data-sign

第一步交大家获取需要的参数

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;
    }


}

查询支付状态

查询订单状态官方文档https://developer.open-douyin.com/docs/resource/zh-CN/mini-app/develop/server/payment/trade-system/general/order/query-order

第一步引入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;
    }

今天的分享就到这了,希望我的文档能帮助到各位

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值