搞了好几天的服务暂不可用,或者sign错误,缺少app_id什么的,终于可以了。  我主要说下流程和我遇到的问题

我是用的tt.pay()。

首先流程:一.后端发送post请求到http://tp-pay.snssdk.com/gateway 获取字节跳动小程序订单号trade_no

     二.获取微信支付返回的mweb_url,和生成支付宝支付链接

     三.生成字节跳动小程序sign(这里如果只用到其中一种支付的时候,官方sdk会有个坑,下面详细写下,我就是这个坑搞了好久)

===============================================================================================================================================

一 : 1.  

//获取头条订单
public String getTradeNo(GroupOrder groupOrder,User user,HttpServletRequest request){
SortedMap<String, Object> parameters = new TreeMap<String, Object>();
JSONObject jsonObject2 = new JSONObject();
jsonObject2.put("out_order_no", System.currentTimeMillis()+"");
jsonObject2.put("uid", user.getOpenId());
jsonObject2.put("merchant_id", GetWX.getPro("ttmchid"));
jsonObject2.put("total_amount",1);//测试用1分
jsonObject2.put("currency", "CNY");
jsonObject2.put("subject", "测试支付");
jsonObject2.put("body","测试订单");
jsonObject2.put("valid_time", "3000");
jsonObject2.put("trade_time", System.currentTimeMillis()+"");
jsonObject2.put("notify_url", "http://www.baidu.com");
jsonObject2.put("risk_info", "{\"ip\":\""+request.getRemoteAddr()+"\"}");

parameters.put("app_id", GetWX.getPro("ttappid"));//不是小程序app_id,是支付配置页面那个appid
parameters.put("biz_content", jsonObject2.toString());
parameters.put("method", "tp.trade.create");
parameters.put("charset", "utf-8");
parameters.put("timestamp", Long.toString(Calendar.getInstance().getTimeInMillis()));
parameters.put("version", "2.0");
parameters.put("format", "JSON");
parameters.put("sign_type", "MD5");
parameters.put("uid", user.getOpenId());
String sign = SignUtil.BuildMd5WithSalt(parameters, "jcz1u0dr762d61meqhmsktw73frpi0n80202n2cw");//官方demo里的方法,我自己的有问题,然后这个sign只是用来获取订单号的签名,并不是最后要的签名
parameters.put("sign", sign);
//System.out.println(parameters.toString());
String result = HttpRequestUtil.sendPost("http://tp-pay.snssdk.com/gateway", SignUtil.GenSignStr(parameters));
System.out.println(result);
JSONObject json = JSONObject.fromObject(result);
if(json.getJSONObject("response").getString("code").equals("10000"))
  return json.getJSONObject("response").getString("trade_no");//订单号
else
  return "";
}

第一步里主要我遇到的是这里的post请求里的参数,需要是a=1&b=2这样的。我之前一直是弄成xml格式,json格式,就一直提示缺少app_id, 这里这个SignUtil.GenSignStr也是官方demo里的

二:这一步是微信或者支付宝相关支付的,我就不写了网上搜的到的很多,就是传给微信和支付宝的订单号就是用上一步生成的

三:先上代码,主要代码是这些,我是上面两部生成订单后跳到有支付按钮页面,支付按钮页面onLoad里异步请求后端执行下面的

TTPayLog.logLevel = TTPayLog.LogLevel.debug;         //log级别可配置为 debug,info,warn,error
TTPayService.appId = "800xxxxxxx";               //支付方分配给业务方的ID,用于获取 签名/验签 的密钥信息(这里x的个数是我随便打了几个的)
TTPayService.appSecret = "jcz1xxxxxxxxxxxxxxxxxxx";      //支付方密钥(这里x的个数是我随便打了几个的)
TTPayService.merchantId = "190xxxx";              //支付方分配给业务方的商户编号(这里x的个数是我随便打了几个的)
TTPayService.tpDomain = "https://tp-pay.snssdk.com/gateway";   // 测试请用https://tp-pay-test.snssdk.com, 线上请用https://tp-pay.snssdk.com

// 下面两个版本号,AppletVersion指的是小程序收银台版本,Version指的是财经后端下单接口版本
// 小程序收银台版本有1.0和2.0,头条APP只在7.2.7之后支持收银台2.0版本,7.2.7之前的版本请使用1.0
// 该参数可设置为"1.0"(返回拉起1.0收银台参数),"2.0"(返回拉起2.0收银台参数),"2.0+"(返回一个json,包含1.0和2.0参数)
TradeCreateRequest request = new TradeCreateRequest();
request.setAppletVersion("2.0");              // 小程序收银台版本,可选1.0,2.0及2.0+
request.setVersion("2.0");                  // 后端下单接口默认为2.0, 可更改为1.0
request.setOutOrderNo(groupOrder.getPayno());      // 此处是随机生成的,使用时请填写您的商户订单号
request.setUid(groupOrder.getOpenid()) ;         // 填写用户在头条的uid
request.setTotalAmount(1L);               // 填写订单金额
request.setCurrency("CNY");              // 填写币种,一般均为CNY
request.setSubject("测试订单") ;             // 填写您的订单名称
request.setBody("测试订单内容") ;             // 填写您的订单内容
request.setTradeTime(groupOrder.getTimeStamp()) ;      // 交易时间,此处自动生成,您也可以根据需求赋值,但必须为Unix时间戳
request.setValidTime("3600");              // 填写您的订单有效时间(单位:秒)
request.setNotifyUrl("http://www.baidu.com");             // 填写您的异步通知地址
request.setRiskInfo("{\"ip\":\""+req.getRemoteAddr()+"\"}");          // 严格json字符串格式
request.setProductCode("pay") ;             // 固定值,不要改动
request.setTradeType("H5") ;              // 固定值,不要改动

// 1.0版本特有参数,当AppletVersion填"1.0"和"2.0+"时需要填写
// request.setParams("{\"url\":\"...\"}");         // 传递给支付方的支付信息,标准 json 格式字符串,不同的支付方参数格式不一样
// request.setPayType("ALIPAY_APP");        // 1.0版本的PayType,目前只支持支付宝,请填写ALIPAY_APP 
// request.setPayChannel("ALIPAY_NO_SIGN");       // 目前只支持支付宝,请填写ALIPAY_NO_SIGN

// 2.0版本特有参数,当AppletVersion填"2.0"和"2.0+"时需要填写
request.setPaymentType("direct") ;           // 2.0版本的PaymentType,固定值direct,不要改动
request.setWxUrl(groupOrder.getSendUrl());         // 调用微信H5支付统一下单接口返回的mweb_url字段值。service=1时(外部开发者)必传,否则无法使用微信支付
request.setWxType("MWEB");             // service=1时(外部开发者),且wx_url有值时,传固定值:MWEB
request.setAlipayUrl("http://www.baidu.com") ;      //官方demo如果你只用微信支付,那这个必须也有值,不然到时候会变成alipay_url=appid=11232...  就有问题,反之只用支付宝不用微信也一样,
TradeCreateResponse res = TTPayService.TradeCreate(request);
String appletParams = res.getAppletParams();
// System.out.println("Get Cashdesk Parameters: " + appletParams);
//log.info("xcx"+appletParams);
System.out.println(JSONObject.fromObject(appletParams).get("2.0"));
map.put("orderInfo", JSONObject.fromObject(JSONObject.fromObject(appletParams).get("2.0")));//这里就是存放前端页面tt.pay里的参数

官方社区里提问了好几天都没有解决,烦死我了

发现支付可以,但是支付完回到小程序页面他没反应,好像检测不到支付成功。妈耶

哇终于解决了,tt.pay里面的

getOrderStatus(res) {
//调用后端接口判断订单是否支付成功
tt.request({
url: 'http://xxx.xxx.com/xxx/checkStatus.shtml',
data: {
no: no,//传给后台的订单号
},
dataType: 'json',
method: 'post',
header: {
'content-type': 'application/x-www-form-urlencoded'
},
success: function (res) {
if (!res.data.hasError) {
//支付成功,执行关闭支付窗口
return new Promise((resolve, reason) => {
resolve({ code: 0 });//这个code:0就是支付成功 其他1234什么的官方有介绍,
})

} else {
//支付失败,支付失败要干嘛具体逻辑自行写
}
}
})

},

转载于:https://www.cnblogs.com/Ffreeway/p/11542234.html

字节跳动小程序tt.pay支付流程和遇到的问题相关推荐

  1. 使用uniapp开发字节跳动小程序的微信支付和支付宝支付(后端PHP,tp5)

    使用uniapp开发字节跳动小程序的微信支付和支付宝支付(后端PHP,tp5) 准备工作 微信支付配置 支付宝支付配置 字节跳动配置 1,微信支付配置: 开通微信支付的h5支付,关联APPID,保存k ...

  2. 字节跳动小程序技术摘要

    微信H5支付抖音小程序支付宝APP支付 微信 H5支付 官网文档链接:https://pay.weixin.qq.com/wiki/doc/api/H5.php?chapter=15_4 流程图: 1 ...

  3. 字节跳动小程序(抖音) uniapp PHP 支付宝SDK 开发支付功能

    目录 前提条件 正文 代码流程: 详细代码 一.获取字节跳动订单 二.获取支付宝alipay_url参数 三.开始生成orderInfo 给前端吊起支付宝咯 总结哈 keke 前提条件 字节跳动: A ...

  4. 字节跳动小程序支付详解

    微信支付详解 1.为什么要写这篇文章 参考了字节跳动官方的文档之后发现写的太简单,完全一头雾水摸不清头脑,后来在百度了别人的实现方案,才得以总结出来. 2.背景 我司要开发一个头条小程序,需要支持支付 ...

  5. 字节跳动小程序接入支付功能

    我个人博客文章地址:字节跳动小程序接入支付功能 这个文章只是我做完支付后的总结,尽量写的简单易懂,也是方便自己以后忘了看一眼就能懂

  6. 字节跳动小程序担保支付请求签名算法-Java实现

    最近在做字节跳动小程序支付相关的功能,官方提供的支付接口,调用需要使用请求签名,但是官方给的加签示例没有Java的实现.这里记录一下Java实现的加签算法. 官方要求的请求签名算法: 1. sign, ...

  7. 百度小程序,字节跳动小程序支付总结

    百度小程序支付: 百度小程序支付生成的签名是rsa签名,这个签名的生成java版本官方给的有demo直接拿过来用就可以,参数传输正确,该去空格的去空格,该加标点符号的加标点符号,rsa公钥私钥保存好, ...

  8. 关于今日头条小程序(字节跳动小程序)相关问题

    上周突然遇到让开发今日头条小程序(字节跳动小程序)的需求,然后看了下文档发现真的简陋.而且文档有错别字.槽点有点多.但是和老版本的小程序相差不多,然后我就抱着试一试的心态,真的是试一试把微信小程序换了 ...

  9. 字节跳动小程序对接环信IM遇到的问题

    前言 这里是一个工作了1年多的前端小白,这是从业以来的第一篇文章,主要跟大家分享一下最近在开发字节跳动小程序时遇到一些问题与自己的解决方法,如果有什么更好的解决方案欢迎大佬们指点一下,写的不好的地方还 ...

最新文章

  1. 利用dom4j取出XML文件中的数据
  2. Netty 高性能特性
  3. Altium designer原理图导入word文档模糊——终极解决办法
  4. 流式计算strom,Strom解决的问题,实现实时计算系统要解决那些问题,离线计算是什么,流式计算什么,离线和实时计算区别,strom应用场景,Strorm架构图和编程模型(来自学习资料)
  5. 如何计算k段流水线执行n条指令的执行时间
  6. 计组之概述:计算机系统
  7. android command line tools 下载,Mac 安装 Android commandlinetools 各种报错的问题
  8. 如果Google统治世界[组图]
  9. 计算机与信息安全基本概念和知识,第8章计算机网络应用与信息安全知识.ppt
  10. BUUCTF WEB 第四页WP(持续更新)
  11. 用Java实现文本编辑器:创建、浏览、编辑文件;剪贴、复制、粘贴;保存、另存为;字符统计;自动换行
  12. Java Map排序
  13. 微软推出 Go 语言免费中文教程,真香!
  14. 将iGoogle-Style新标签页添加到Chrome
  15. 显示器/电脑屏幕字体出现重影
  16. 为什么计算机二级查成绩显示验证码错误,我明明输入的是正确的验证码,为何电脑总显示验证码错误呢?...
  17. C#之浅析面向对象编程思想(二)
  18. tf1.x error:Variable generator/encoder_image/conv2d/kernel already exists, disallowed
  19. 计蒜客——恋爱纪念日(学习如何格式化打印日期)
  20. 《概率论与数理统计》之样本空间和随机事件

热门文章

  1. 以java语言为工具的粗糙的飞机大战游戏的开发与实现
  2. 慎独,是自律的最高层次
  3. Python学习 Task9:文件与文件系统
  4. 软件架构-Nosql之redis
  5. oracle核销预付账款,AP模块外币预付款核销的CNY尾差问题
  6. 【原创】【百度之星2017资格赛1003】度度熊与邪恶大魔王
  7. Variable Generator/dense/kernel already exists, disallowed.
  8. 学习数据可视化,读哪本书比较好?
  9. 亚马逊苹果手机数据爬取
  10. 马化腾是学计算机的吗,马化腾大学实际上是病毒编写者,经常编写感染计算机的程序...