《抖音支付》担保支付-预收款

这篇具有很好参考价值的文章主要介绍了《抖音支付》担保支付-预收款。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

官方提供的签名和验签方法,替换上自己的支付系统秘钥 SALT


import java.nio.charset.StandardCharsets;
import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException;
import java.util.*;
import java.util.stream.Collectors;

public class DouYinSign {
    /**
     * 担保支付请求不参与签名参数
     * app_id 小程序appID
     * thirdparty_id 代小程序进行该笔交易调用的第三方平台服务商id
     * sign 签名
     * other_settle_params 其他分账方参数
     *
     * Guaranteed payment requests do not participate in signature parameters
     * app_id Applets appID
     * thirdparty_id The id of the third-party platform service provider that calls the transaction on behalf of the Applets
     * sign sign
     * other_settle_params Other settle params
     */
    public final static List<String> REQUEST_NOT_NEED_SIGN_PARAMS = Arrays.asList("app_id", "thirdparty_id", "sign", "other_settle_params");

    /**
     * 支付密钥值,需要替换为自己的密钥(完成进件后,开发者可在字节开放平台-【某小程序】-【功能】-【支付】-【担保交易设置】中查看支付系统秘钥 SALT)
     *
     * Payment key value, you need to replace it with your own key
     */
    private static final String SALT = "支付系统秘钥 SALT";

    /**
     * RequestSign 担保支付请求签名算法
     * @param paramsMap {@code Map<String, Object>} 所有的请求参数
     * @return:签名字符串
     *
     * RequestSign Guaranteed payment request signature algorithm
     * @param paramsMap {@code Map<String, Object>} all request parameters
     * @return: Signature string
     */
    public static String requestSign(Map<String, Object> paramsMap) {
        List<String> paramsArr = new ArrayList<>();
        for (Map.Entry<String, Object> entry : paramsMap.entrySet()) {
            String key = entry.getKey();
            if (REQUEST_NOT_NEED_SIGN_PARAMS.contains(key)) {
                continue;
            }
            String value = entry.getValue().toString();

            value = value.trim();
            if (value.startsWith("\"") && value.endsWith("\"") && value.length() > 1) {
                value = value.substring(1, value.length() - 1);
            }
            value = value.trim();
            if (value.equals("") || value.equals("null")) {
                continue;
            }
            paramsArr.add(value);
        }
        paramsArr.add(SALT);
        Collections.sort(paramsArr);
        StringBuilder signStr = new StringBuilder();
        String sep = "";
        for (String s : paramsArr) {
            signStr.append(sep).append(s);
            sep = "&";
        }
        return md5FromStr(signStr.toString());
    }

    /**
     * CallbackSign 担保支付回调签名算法
     * @param params {@code List<String>} 所有字段(验证时注意不包含 sign 签名本身,不包含空字段与 type 常量字段)内容与平台上配置的 token
     * @return:签名字符串
     *
     * CallbackSign Guaranteed payment callback signature algorithm
     * @param params {@code List<String>} The content of all fields (note that the sign signature itself is not included during verification, and does not include empty fields and type constant fields) content and the token configured on the platform
     * @return: signature string
     */
    public static String callbackSign(List<String> params) {
        try {
            String concat = params.stream().sorted().collect(Collectors.joining(""));
            byte[] arrayByte = concat.getBytes(StandardCharsets.UTF_8);
            MessageDigest mDigest = MessageDigest.getInstance("SHA1");
            byte[] digestByte = mDigest.digest(arrayByte);

            StringBuffer signBuilder = new StringBuffer();
            for (byte b : digestByte) {
                signBuilder.append(Integer.toString((b & 0xff) + 0x100, 16).substring(1));
            }
            return signBuilder.toString();
        } catch (Exception exp) {
            return "";
        }
    }

    /**
     * md5FromStr md5算法对该字符串计算摘要
     * @param inStr {@code String} 需要签名的字符串
     * @return:签名字符串
     *
     * md5FromStr The md5 algorithm computes a digest of the string
     * @param inStr {@code String} String to be signed
     * @return: signature string
     */
    private static String md5FromStr(String inStr) {
        MessageDigest md5;
        try {
            md5 = MessageDigest.getInstance("MD5");
        } catch (NoSuchAlgorithmException e) {
            e.printStackTrace();
            return "";
        }

        byte[] byteArray = inStr.getBytes(StandardCharsets.UTF_8);
        byte[] md5Bytes = md5.digest(byteArray);
        StringBuilder hexValue = new StringBuilder();
        for (byte md5Byte : md5Bytes) {
            int val = ((int) md5Byte) & 0xff;
            if (val < 16) {
                hexValue.append("0");
            }
            hexValue.append(Integer.toHexString(val));
        }
        return hexValue.toString();
    }
}

public  String preOrder(String appId, String notify_url, Integer total_amount, String orderNo, String subject, String detail){

        // 示例参数
        Map<String, Object> params = new HashMap<>();
        params.put("app_id",app_id);
        params.put("out_order_no", orderNo); //商户订单号
        params.put("total_amount", total_amount); //金额。分
        params.put("notify_url", notify_url);  //回调接口
        params.put("subject", subject); //主题
        params.put("body", detail); //商品详情
        params.put("valid_time", 5*60); //过期时间
        String sign = DouYinSign.requestSign(params); //签名
        params.put("sign",sign);
		//发起post请求
        String postJson = doPostJson("https://developer.toutiao.com/api/apps/ecpay/v1/create_order", JSONObject.toJSONString(params), "UTF-8");

        if (StringUtils.isNoneBlank(postJson)) {
            JSONObject jsonObject = JSONObject.parseObject(postJson);
            if ("success".equals(jsonObject.get("err_tips")))
            {
                return jsonObject.get("data").toString();
            } else {
                throw new GlobalException("抖音支付生成失败" + postJson);
            }
        }
        return null;
    }

public String dyNotify(HttpServletRequest request, HttpServletResponse response) {

    try {
        request.setCharacterEncoding("utf-8");
        response.setCharacterEncoding("utf-8");
        response.setContentType("text/html;charset=UTF-8");
        response.setHeader("Access-Control-Allow-Origin", "*");
        InputStream in = request.getInputStream();
        ByteArrayOutputStream out = new ByteArrayOutputStream();
        byte[] buffer = new byte[1024];
        int len;
        while ((len = in.read(buffer)) != -1) {
            out.write(buffer, 0, len);
        }
        out.close();
        in.close();
        String responseJson = new String(out.toByteArray(),"utf-8");
        logger.info("responseJson:{}",responseJson);
        JSONObject jsonObject = JSONObject.parseObject(responseJson);
        JSONObject msgJson = jsonObject.getJSONObject("msg");
        String resultCode = jsonObject.getString("type");
        if ("payment".equalsIgnoreCase(resultCode)) {
            List<String> sortedString = new ArrayList<>();
            //token
            sortedString.add("token");
            //时间戳
            sortedString.add(jsonObject.getString("timestamp"));
            //随机数
            sortedString.add(jsonObject.getString("nonce"));
            //msg
            sortedString.add(jsonObject.getString("msg"));
            Collections.sort(sortedString);
            StringBuilder sb = new StringBuilder();
            sortedString.forEach(sb::append);
            String msg_signature = jsonObject.getString("msg_signature");
            String sign = DouYinSign.callbackSign(sortedString);
            logger.info("支付回调接口密钥签名:{}",sign);
            if(!sign.equals(msg_signature)) {//判断签名,此处验签有问题
                JSONObject resultJson = new JSONObject();
                resultJson.put("err_no",8);
                resultJson.put("err_tips","error");
            }
          String orderNo =  msgJson.getString("cp_orderno"); //商户订单号
          String order_id =  msgJson.getString("order_id");  //抖音订单id
          Integer orderAmount =  msgJson.getInteger("total_amount");  //支付金额

			//todo 处理支付成功后的订单业务
			
            JSONObject resultJson = new JSONObject();
            resultJson.put("err_no",0);
            resultJson.put("err_tips","success");

            //todo 同步订单变成已支付 

            return resultJson.toString();
        } else {
            //订单编号
            String outTradeNo = msgJson.getString("cp_orderno");
            logger.error("订单" + outTradeNo + "支付失败");
            JSONObject resultJson = new JSONObject();
            resultJson.put("err_no",0);
            resultJson.put("err_tips","error");
            return resultJson.toString();
        }
    } catch (Exception e) {
        e.printStackTrace();
        JSONObject resultJson = new JSONObject();
        resultJson.put("err_no",8);
        resultJson.put("err_tips","error");
        return resultJson.toString();
    }
}

后续还需要同步订单,担保支付的订单需要同步到抖音商场订单里面

验签参考文章:https://blog.csdn.net/m0_59963277/article/details/123048704文章来源地址https://www.toymoban.com/news/detail-606653.html

到了这里,关于《抖音支付》担保支付-预收款的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • uni-app/vue 文字转语音朗读(附小程序语音识别和朗读)uniapp小程序使用文字转语音播报类似支付宝收款播报小程序语音识别和朗读)

    uni-app/vue 文字转语音朗读(小程序语音识别和朗读) 一、第一种方式:直接加语音包 固定的文本 先利用工具生成了 文本语音mp3文件,放入项目中,直接用就好了 这里用到的工具:知意配音 链接地址:https://peiyin.wozhiyi.com/newproduction.html 接下来,代码部分。 在min.js文件里加

    2024年02月07日
    浏览(38)
  • 【支付】字节抖音小程序,调起内置支付 uniapp

    提交订单,后端返回 重要数据 包含 appid ,时间戳 一些 (把数据 JSON.parse处理一下) 调用内置支付 1.首先通过uni.getProvider方法获取到用户手机里的服务商,service选择payment,共有4种方式alipay(支付宝支付)、wxpay(微信支付)、baidu(百度收银台支付)、appleiap(苹果应用内

    2024年02月13日
    浏览(34)
  • uniapp前端支付篇(微信、抖音、快手、h5)四个平台支付

    微信、快手、h5支付步骤大致相同,只有抖音是有自己的支付组件 项目同时支持多个(微信、快手、h5)平台支付,后端那边代码可以封装的 点击支付 创建订单 生成密钥和支付所需要的参数 支付成功 查询订单状态 1.支付按钮 2.支付事件 1.支付按钮 2.支付事件 抖音有自己的

    2024年02月02日
    浏览(38)
  • 抖音小程序支付开发流程和实现

    第一步:在字节小程序开发者平台注册账号 第二步:创建应用完善资料 第三步:在功能管理--支付 中申请相对应的担保支付(微信,支付宝,抖音支付) 还需要后端同学配一下这个 这步完成了就到代码开发环节了 第四步 按照开发文档开发 开发文档地址:https://microapp.byt

    2024年02月13日
    浏览(31)
  • 抖音小程序开发,收银台支付回调通知

    大家好,我是小悟 关于抖音小程序收银台支付,可阅读【抖音小程序开发,唤起收银台,包括抖音支付、支付宝支付、微信支付】。 做支付功能最重要的一步就是异步回调通知,所谓回调通知就是唤起收银台支付,支付成功后,平台会通过提前设置好的回调地址,将用户支

    2024年02月13日
    浏览(26)
  • 字节抖音小程序,使用 uniapp 调起内置支付

    后端通过抖音预下单接口,提交支付订单信息。 预下单接口_小程序_抖音开放平台 预下单接口 提交支付订单信息。 ## 使用限制 无 ## 接口说明 预下单接口需要保证同一app_id下每笔订单的out_order_no是唯一的。同一订单(app_id,out_order_no相同)重复请求需要保持请求参数一致,否

    2024年02月15日
    浏览(27)
  • 抓包抖音充值页面实现微信支付宝充值抖币,可提供api

    抖币充值系统重写升级: 1.支持配置扫码配置多个CK 2.支持生成 微信/支付宝 支付二维码 扫码充值 3.支持 微信/支付宝 APP 直接唤醒充值 体验如下: 需要的小伙伴可私信 留言! 整个开发流程思路是以下几步: 1.抓包分析抖音的充值的整个流程,提取关键的一些请求和API 2.把每个

    2024年02月05日
    浏览(37)
  • 抖音在线点赞任务发布接单运营平台PHP网站源码 多个支付通道+分级会员制度

    源码介绍 1、三级代理裂变,静态返佣/动态返佣均可设置。(烧伤制度)。 2、邀请二维码接入防红跳转。 3、自动机器人做任务,任务时间可设置,机器人价格时间可设置。 4、后台可设置注册即送X天机器人。 5、不同级别会员使用机器人做的任务对应不同等级会员任务。

    2024年04月10日
    浏览(34)
  • 0032Java程序设计-基于JavaEE的智能化酒店点餐收款系统的设计与实现论文

    酒店点餐收款系统是为了实现酒店餐饮自动化管理而设计的,它完全取代了原来酒店餐饮管理一直使用的人工处理的工作方式,并且避免了由于管理人员的工作疏忽以及管理质量问题所造成的各种错误,为及时、准确、高效的完成酒店餐饮管理工作提供了强有力的工具和管理

    2024年02月06日
    浏览(26)
  • [论文阅读] (31)李沐老师视频学习——4.研究的艺术·理由、论据和担保

    《娜璋带你读论文》系列主要是督促自己阅读优秀论文及听取学术讲座,并分享给大家,希望您喜欢。由于作者的英文水平和学术能力不高,需要不断提升,所以还请大家批评指正,非常欢迎大家给我留言评论,学术路上期待与您前行,加油。 前一篇带来李沐老师对论文写作

    2024年02月09日
    浏览(47)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包