字節跳動小程序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 {
//支付失敗,支付失敗要干嘛具體邏輯自行寫
}
}
})
 
},

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM