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

 

 

搞了好几天的服务暂不可用,或者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 {
//支付失败,支付失败要干嘛具体逻辑自行写
}
}
})
 
},

 

posted @ 2019-09-18 15:01  Ffreeway  阅读(5843)  评论(7编辑  收藏  举报