字节跳动小程序支付接入

字节跳动小程序支付接入

  • 躺过的坑
    • 流程
    • 签名
    • 支付宝配置问题
    • java福利

躺过的坑

  • 流程
    • 小程序申请流程
    • 业务调用流程
  • 签名
    • 请求字节跳动接口的签名
    • 请求预下单返回验签
  • 支付宝配置问题

流程

  • 小程序申请流程

    • 字节跳动小程序开通申请有个渠道秘钥类型选择RSA2和RSA,不管你选择哪个,和最后拉起的支付宝url没关系,这里的选择不影响支付宝的签名;比如这里选择RSA2,我支付宝签名使用RSA是没问题的。(申请开通支付)
      渠道秘钥类型
    • 字节跳动小程序支付的商户配置和支付宝的支付商户配置是没有关系的两个东西。前者是和字节跳动这边的互相签名验签需要的东西;后者是拉起支付宝支付的东西。不要把前者的商户、APPID、支付secret和后者的mchid、APPID、公钥私钥混在一起。只不过要在字节跳动这边发起支付,需要去他们平台做一个身份认证,然后帮你拉起支付而已。
      字节跳动商户界面
  • 业务调用流程

    • 支付业务调用流程:
      1.预下单:获取字节跳动的内部订单号(服务端下单接口);
      2.调用支付宝app支付,获取拉起支付宝支付url(支付宝app支付接口2.0);
      3.组装前端发起参数(发起头条支付);

签名

  • 请求字节跳动接口的签名(签名说明)
    • 1.注意参数类型,特别是涉及金额的字段(如:total_amount)单位是分,参数类型是整数;
    • 2.请求签名类型选择MD5,最后组装的参数字符串string + app_secret,**中间是没有‘&’**连接的;
  • 请求预下单返回验签
    • 1.接口返回参数验签,最后组装的验签参数字符串string ,不需要app_secret;
    • 2.验签的算法是MD5withRSA,之前自己误认为是先MD5然后在用RSA验签,其实这个是一个算法名称;

支付宝配置问题

如果和字节跳动的交互都没问题,还是返回报错:{“errMsg”:“requestPayment:fail 4000”};

  • 那么就要检查支付宝url的问题了,看自己下的单能否单独拉起支付宝;下载支付宝测试app(客户端调试工具),看看自己的配置是否有问题;
  • 如果使用支付宝测试app拉起支付报错ALIN10146-有对应的自查方案(ALIN10146-自查方案);

java福利

  • 组装签名参数:
import org.apache.commons.codec.digest.DigestUtils;//对请求参数进行组装+key
public static String alipayLiteSign(Map<String, Object> map,String key) {String result = getSignCheckContent(map);result=result+key;String sign = DigestUtils.md5Hex(result.toString());log.info("alipayLiteSign: sign-content={};sign={}",result,sign);return sign;}//组装参数public static String getSignCheckContent(Map<String, Object> map) {ArrayList<String> list = new ArrayList<String>();for (Map.Entry<String, Object> entry : map.entrySet()) {if (entry.getKey().equals("sign")) {continue;}if (entry.getValue() != null && entry.getValue() != "") {list.add(entry.getKey() + "=" + entry.getValue() + "&");}}int size = list.size();String[] arrayToSort = list.toArray(new String[size]);Arrays.sort(arrayToSort, String.CASE_INSENSITIVE_ORDER);StringBuilder sb = new StringBuilder();for (int i = 0; i < size; i++) {sb.append(arrayToSort[i]);}String result = sb.toString();result = result.substring(0, result.length()-1);return result;}
  • 数字签名-验签
import java.security.KeyFactory;
import java.security.KeyPair;
import java.security.KeyPairGenerator;
import java.security.PrivateKey;
import java.security.PublicKey;
import java.security.Signature;
import java.security.spec.PKCS8EncodedKeySpec;
import java.security.spec.X509EncodedKeySpec;
import org.apache.commons.codec.binary.Base64;/*** String转公钥PublicKey* @param key* @return* @throws Exception*/public static PublicKey getPublicKey(String key) throws Exception {byte[] keyBytes;keyBytes = (new Base64()).decode(key);X509EncodedKeySpec keySpec = new X509EncodedKeySpec(keyBytes);KeyFactory keyFactory = KeyFactory.getInstance("RSA");PublicKey publicKey = keyFactory.generatePublic(keySpec);return publicKey;}//对用md5和RSA私钥生成的数字签名进行验证public static boolean verifyWhenMd5Sign(String content, String sign, PublicKey publicKey) throws Exception {byte[] contentBytes = content.getBytes("utf-8");Signature signature = Signature.getInstance("MD5withRSA");signature.initVerify(publicKey);signature.update(contentBytes);return signature.verify(Base64.decodeBase64(sign));}

版权声明:本文为博主原创文章,未经博主允许不得转载。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/413623.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

工作322:uni-扩展运算符实现拼接合并操作

}).then(res>{if (res.data.code 200) {/* 进行合并操作 */this.tableData [...this.tableData, ...res.data.data.records]this.pages res.data.data.pagesconsole.log(1)console.log(res)}})

深入浅出JVM-内存模型

JVM内存模型总图程序计数寄存器Java虚拟机栈(JVM Stack)定义特点本地方法栈(Native Method Stack)Java堆(Java Heap)定义特点方法区定义特性可能抛出的异常直接内存(Direct Memory)Metaspace (元空间)元空间特色GC元空间内存分配模型从GC角度看Java堆JVM关闭总图 程序计数寄存器…

HDU 4487 Maximum Random Walk

Maximum Random Walk Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Total Submission(s): 756 Accepted Submission(s): 419 三维dp&#xff0c;一维的话根本没有办法开展&#xff0c;二维的话没办法保存当前位置或者最远位置&…

工作323:uni-获取时间参数

let date new Date();let dateYear date.getFullYear(); //获取年 let dateMonth date.getMonth(); //获取月 let dateDate date.getDate(); //获取当日let dateDay date.getDay(); //获取当日星期数let da…

深入浅出JVM-GC过程

深入浅出JVM-GC过程Minor GC对象进入老年代的4种情况Full GC空间分配担保Minor GC Minor GC过程 假设现在Heap内存大小为20M&#xff0c;其中年轻代为10M&#xff0c;老年代为10M&#xff0c;年轻代中Eden区6M&#xff0c;From区2M&#xff0c;To区2M&#xff0c;新创建的对象…

工作324:uni-时间过滤器封装

filters: {toChangeDate(e) {console.log(new Date(e).getFullYear())console.log(new Date(e).getMonth())console.log(new Date(e).getDay())let dateYear new Date(e).getFullYear(); //获取年 let dateMonth new Date(e).getMonth()1<10? 0 new Date(e).getMonth() …

[Python] 制作启动uiautomator2 的web版 uiautomatorviewer2 批处理启动

打开一个txt文件&#xff0c;复制如下命令进行并另存为为 .bat文件 1 echo on 2 echo 正在启动 uiautomatorviewer2 3 4 python -m weditor 5 6 echo off 注意&#xff1a;如果批处理里面有中文的话&#xff0c;一定要将 txt 文本的编码方式设置为 ANSI 编码进行保存&#xf…

工作325:uni-日期小于10补0

// 创建补0函数 function pZone (s) {return s < 10 ? 0 s : s }pZone(num)

深入理解java虚拟机--线程安全与锁优化

深入理解java虚拟机--线程安全与锁优化面向过程编程思想和面向对象编程思想java语言中的线程安全线程安全的实现方法锁优化面向过程编程思想和面向对象编程思想 面向过程编程思想&#xff1a;站在计算机的角度&#xff0c;以算法为核心&#xff0c;数据是客体&#xff0c;程序…

配置mysql环境变量

配置mysql环境变量&#xff08;非必要&#xff09; 说明&#xff1a;给mysql配置环境变量后我们就可以在cmd里运行mysql&#xff08;开启、停止等操作&#xff09; 1. 和其实环境变量的配置方法一样&#xff0c;我们打开环境变量配置窗口&#xff08;组合键winPause -> 更改…

工作325:uni-格式化日期

/*格式化日期&#xff1a;yyyy-MM-dd*/formatDate(date) {var myyear date.getFullYear();var mymonth date.getMonth() 1;var myweekday date.getDate();if (mymonth < 10) {mymonth "0" mymonth;}if (myweekday < 10) {myweekday "0" mywe…

微信小程序获取unionid为空

微信小程序获取unionid为空原因&#xff1a;未绑定微信开放平台绑定步骤原因&#xff1a;未绑定微信开放平台 最新在调试一个新的微信小程序&#xff0c;因为要对web授权登录、app授权登录、小程序授权登录&#xff1b;几种登录场景根据unionid来开放登录。但是授权出现获取un…

《精通Python设计模式》学习之原型模式

暂时在工作中&#xff0c;还没有用到呢~~~ 以后要留意一下&#xff0c;主要用于复制对象副本&#xff0c; 然后又有自定义属性的地方。 import copy from collections import OrderedDictclass Book:def __init__(self, name, authors, price, **rest):self.name nameself.aut…

alipay.data.bill.balance.query ISV权限不足

alipay.data.bill.balance.query ISV权限不足alipay.data.bill.balance.query是支付宝商家账户当前余额查询接口&#xff1b;目前调用该接口返回 ISV权限不足 完整返回&#xff1a; {"body":"{"alipay_data_bill_balance_query_response":{"cod…

[css] 你有用过animation-fill-mode属性吗?它有什么应用场景

[css] 你有用过animation-fill-mode属性吗&#xff1f;它有什么应用场景 动画播放完成之后的动作&#xff0c;比如可以定义动画播放完成之后回到初始状态个人简介 我是歌谣&#xff0c;欢迎和大家一起交流前后端知识。放弃很容易&#xff0c; 但坚持一定很酷。欢迎大家一起讨…

[css] 用css实现一个等腰三角形的小图标

[css] 用css实现一个等腰三角形的小图标 <style>.box{width: 0;height: 0;margin: 100px auto;border-width: 0px 200px 200px 200px;border-style: solid;border-color: transparent transparent red transparent;}</style>个人简介 我是歌谣&#xff0c;欢迎和大…

shell语法 06-Linux文本处理-grep

grep命令在一个或多个文件中查找某个字符模式。如果这个模式中包含空格&#xff0c;就必须用引号把它括起来。grep Tom /etc/passwd grep 将在文件中查找/etc/passwd 中查找模式 Tom。结果如下&#xff1a; 查找成功&#xff0c;文件中相应行会显在屏幕上没有找到指定的模式&am…

[css] 使用css实现蒙版的效果

[css] 使用css实现蒙版的效果 filter: blur(1px)个人简介 我是歌谣&#xff0c;欢迎和大家一起交流前后端知识。放弃很容易&#xff0c; 但坚持一定很酷。欢迎大家一起讨论 主目录 与歌谣一起通关前端面试题

redis启动警告解决

背景 最近在测试环境重启后,redis启动遇到了三个警告 第一个警告&#xff1a;The TCP backlog setting of 511 cannot be enforced because /proc/sys/net/core/somaxconn is set to the lower value of 128. 第二个警告&#xff1a;overcommit_memory is set to 0! Background…

[css] 父元素下有子元素,子元素也有高度但父元素的高度为何为0呢?分析下可能出现的原因及解决方法

[css] 父元素下有子元素&#xff0c;子元素也有高度但父元素的高度为何为0呢&#xff1f;分析下可能出现的原因及解决方法 父元素塌陷父元素在文档流中高度默认是被子元素撑开的&#xff0c;当子元素脱离文档流以后&#xff0c;将无法撑起父元素的高度&#xff0c;也就会导致父…