搞了好幾天的服務暫不可用,或者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里面的