抖音小程序通用交易系统-交易下单接入-Java

一.首次接入生成密钥

openssl

genrsa -out private_key.pem 2048

rsa -in private_key.pem -pubout -out public_key.pem

pkcs8 -topk8 -inform PEM -in private_key.pem -outform PEM -nocrypt -out rsa_private_key.pem

rsa -in rsa_private_key.pem -pubout -out rsa_public_key.pem

exit

// 注:生成出来的私钥文件为rsa_private_key.pem, 公钥文件为rsa_public_key.pem

// PKCS8格式,私钥以-----BEGIN PRIVATE KEY-----开头,-----END PRIVATE KEY-----结尾

按照官方文档所述一步一步执行就好

生成的公钥文件rsa_public_key.pem需要登录抖音开放平台

,配置在小程序的「开发管理-开发设置」页,「密钥设置」处

二.将官方文档上给出的生成byteAuthorization的方法集成在程序里

Service层: 

public  String getByteAuthorization(String privateKeyStr, String data, String appId, String nonceStr, long timestamp, String keyVersion) ;

        public String getSignature(String privateKeyStr, String method, String uri, long timestamp, String nonce, String data) throws Exception;

        public PrivateKey string2PrivateKey(String privateKeyStr);

ServiceImpl层:

public  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 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";
        Signature sign = Signature.getInstance("SHA256withRSA");
        sign.initSign(string2PrivateKey(privateKeyStr));
        sign.update(rawStr.getBytes(StandardCharsets.UTF_8));
        return Base64.getEncoder().encodeToString(sign.sign());
    }

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

三.写实际业务接口

@PostMapping("prepay")
    public Object payPrepay(@RequestBody PayPrePayRequest amt) {
        Map<String, Object> resultObj = new HashMap();
        if (amt.getAmt() == null || amt.getAmt().compareTo(BigDecimal.ZERO) == 0) {
            resultObj.put("err_no","-1");
            resultObj.put("err_msg","金额不正确");
            return resultObj;
        }
        String orderId = amt.getOrderId();
        String remark = amt.getRemark();
        if (StringUtils.isBlank(orderId)) {
            resultObj.put("err_no","-1");
            resultObj.put("err_msg","请输入订单ID");
            return resultObj;
        }
        //内部生成订单
        WzRechargeLog wzRechargeLog = new WzRechargeLog();
        Long userid = SecurityUtils.getDyLoginUser().getUserid();
        WzDouyinUser wzDouyinUser = wzDouyinUserService.selectWzDouyinUserById(userid);
        wzRechargeLog.setCustomerMobile(wzDouyinUser.getMobile());
        wzRechargeLog.setNickname(wzDouyinUser.getNickname());
        wzRechargeLog.setCustomerId(userid);
        wzRechargeLog.setCode(orderId);
        wzRechargeLog.setRemark(remark);
        wzRechargeLog.setRechargeAmount(amt.getAmt());
        this.wzRechargeLogService.insertWzRechargeLog(wzRechargeLog);

        log.error("---------amt:{} appId{} orderNo:{}",amt,appId, orderId);
        // 请求时间戳
        long timestamp = System.currentTimeMillis()/1000L;
        // 开发者填入自己的小程序app_id
        // 随机字符串
        String nonceStr = UUID.randomUUID().toString();
        // 应用公钥版本,每次重新上传公钥后需要更新,可通过「开发管理-开发设置-密钥设置」处获取R
        String keyVersion = "1";
        // 应用私钥,用于加签 重要:1.测试时请修改为开发者自行生成的私钥;2.请勿将示例密钥用于生产环境;3.建议开发者不要将私钥文本写在代码中
        String privateKeyStr = "XXXXXXXXXXXXXXXXXXX".replace("\n","");
        // 生成好的data
        JSONObject data = new JSONObject();
        JSONArray skuList = new JSONArray();
        JSONObject sku = new JSONObject();
        sku.put("skuId", "1");
        sku.put("price", amt.getAmt().multiply(new BigDecimal(100)).intValue());
        sku.put("quantity",1);
        sku.put("title", "充值");
        sku.put("imageList", Arrays.asList("https://XXXX.cn/profile/upload/2024/02/21/recharge_20240221161433A001.jpg"));
        sku.put("type", 301);//根据官方文档选择对应的类型
        sku.put("tagGroupId", "tag_group_7272625659888058380");
        skuList.add(sku);
        JSONObject orderEntrySchema = new JSONObject();
        orderEntrySchema.put("path", "pages/mine/xxxx/rechargeLog/index");
        data.put("skuList", skuList);
        data.put("outOrderNo", orderId);//自己程序生成的订单号
        data.put("totalAmount", amt.getAmt().multiply(new BigDecimal(100)).intValue());
        data.put("limitPayWayList", new ArrayList<>());
        data.put("payExpireSeconds", 3000);
        data.put("orderEntrySchema", orderEntrySchema);
        data.put("payNotifyUrl",payNotifyUrl);//回调地址
        String s = data.toJSONString();
        String byteAuthorization = commonService.getByteAuthorization(privateKeyStr, s, appId, nonceStr, timestamp, keyVersion);
        resultObj.put("data", s);
        resultObj.put("byteAuthorization", byteAuthorization);
        return resultObj;
    }

  • 14
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值