字节跳动小程序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里面的