字节跳动⼩程序tt.pay⽀付流程和遇到的问题
搞了好⼏天的服务暂不可⽤,或者sign错误,缺少app_id什么的,终于可以了。我主要说下流程和我遇到的问题
我是⽤的tt.pay()。
    ⼆.获取⽀付返回的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", OpenId());
jsonObject2.put("merchant_id", Pro("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", "www.baidu");
jsonObject2.put("risk_info", "{\"ip\":\""+RemoteAddr()+"\"}");
parameters.put("app_id", Pro("ttappid"));//不是⼩程序app_id,是⽀付配置页⾯那个appid
parameters.put("biz_content", String());
parameters.put("method", "ate");
parameters.put("charset", "utf-8");
parameters.put("timestamp", Instance().getTimeInMillis()));
parameters.put("version", "2.0");
parameters.put("format", "JSON");
parameters.put("sign_type", "MD5");
parameters.put("uid", OpenId());
String sign = SignUtil.BuildMd5WithSalt(parameters, "jcz1u0dr762d61meqhmsktw73frpi0n80202n2cw")
;//官⽅demo⾥的⽅法,我⾃⼰的有问题,然后这个sign只是⽤来获取订单号
的签名,并不是最后要的签名
parameters.put("sign", sign);
//System.out.String());
String result = HttpRequestUtil.sendPost("tp-pay.snssdk/gateway", SignUtil.GenSignStr(parameters));
System.out.println(result);
JSONObject json = JSONObject.fromObject(result);
JSONObject("response").getString("code").equals("10000"))
  JSONObject("response").getString("trade_no");//订单号
else
  return "";
}
第⼀步⾥主要我遇到的是这⾥的post请求⾥的参数,需要是a=1&b=2这样的。我之前⼀直是弄成xml格式,json格式,就⼀直提⽰缺少app_id, 这⾥这个SignUtil.GenSignStr也是官
⽅demo⾥的
⼆:这⼀步是或者⽀付宝相关⽀付的,我就不写了⽹上搜的到的很多,就是传给和⽀付宝的订单号就是⽤上⼀步⽣成的
三:先上代码,主要代码是这些,我是上⾯两部⽣成订单后跳到有⽀付按钮页⾯,⽀付按钮页⾯onLoad⾥异步请求后端执⾏下⾯的
// 下⾯两个版本号,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.Payno());      // 此处是随机⽣成的,使⽤时请填写您的商户订单号
request.Openid()) ;        // 填写⽤户在头条的uid
request.setTotalAmount(1L);               // 填写订单⾦额
request.setCurrency("CNY");              // 填写币种,⼀般均为CNY
request.setSubject("测试订单") ;             // 填写您的订单名称
request.setBody("测试订单内容") ;            // 填写您的订单内容
request.TimeStamp()) ;      // 交易时间,此处⾃动⽣成,您也可以根据需求赋值,但必须为Unix时间戳
request.setValidTime("3600");              // 填写您的订单有效时间(单位:秒)
request.setNotifyUrl("www.baidu");             // 填写您的异步通知地址
request.setRiskInfo("{\"ip\":\""+RemoteAddr()+"\"}");          // 严格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.SendUrl());         // 调⽤H5⽀付统⼀下单接⼝返回的mweb_url字段值。service=1时(外部开发者)必传,否则⽆法使⽤⽀付request.setWxType("MWEB");             // service=1时(外部开发者),且wx_url有值时,传固定值:MWEB
request.setAlipayUrl("www.baidu") ;      //官⽅demo如果你只⽤⽀付,那这个必须也有值,不然到时候会变成alipay_url=  就有问题,反之只⽤⽀付宝不⽤也⼀样,
TradeCreateResponse res = TTPayService.TradeCreate(request);
String appletParams = AppletParams();
// 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) {
//调⽤后端接⼝判断订单是否⽀付成功
url: '/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 {
/
/⽀付失败,⽀付失败要⼲嘛具体逻辑⾃⾏写
}
}
})
},

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。