二 微信支付分對接(java)

1.支付分對接時(shí)注意的坑

創(chuàng)建支付分訂單API? ??https://api.mch.weixin.qq.com/v3/payscore/serviceorder

修改訂單金額API? ? ? ?https://api.mch.weixin.qq.com/v3/payscore/serviceorder/{out_order_no}/modify

取消支付分訂單API? ? https://api.mch.weixin.qq.com/v3/payscore/serviceorder/{out_order_no}/cancel

完結(jié)支付分訂單API? ? https://api.mch.weixin.qq.com/v3/payscore/serviceorder/{out_order_no}/complete

注:劃刪除線的部分是在url上拼接path的乒融,并且傳輸時(shí)param不可包含 out_order_no這個(gè)參數(shù)。

所以,我作了如下處理:


根據(jù)api替換參數(shù)专普,并且移除param的out_order_no

回調(diào)處理 :

@PostMapping("/confirmNotify")

@ResponseBody

public JSONObjectconfirmNotify(HttpServletRequest request){

try{

ServletInputStream servletInputStream = request.getInputStream();

? ? ? ? int contentLength = request.getContentLength();

? ? ? ? byte[] callBackInBytes =new byte[contentLength];

? ? ? ? servletInputStream.read(callBackInBytes, 0, contentLength);

? ? ? ? String callBackIn =new String(callBackInBytes, StandardCharsets.UTF_8);

? ? ? ? logger.info("【微信支付分回調(diào)】{}" , callBackIn);

? ? ? ? JSONObject notifyIn = JSONObject.parseObject(callBackIn);

? ? ? ? if (notifyIn ==null) {

logger.info("支付回調(diào)失敗古胆,參數(shù)不正確疗认,反序列化失敗");

? ? ? ? }

//解密回調(diào)信息

? ? ? ? assert notifyIn !=null;

? ? ? ? JSONObject resource = notifyIn.getJSONObject("resource");

? ? ? ? byte[] key = (wxConfig.IV3KEY).getBytes(StandardCharsets.UTF_8);

? ? ? ? ApiV3Util aesUtil =new ApiV3Util(key);

? ? ? ? String decryptToString = aesUtil.decryptToString(resource.getString("associated_data").getBytes(StandardCharsets.UTF_8), resource.getString("nonce").getBytes("UTF-8"), resource.getString("ciphertext"));

? ? ? ? if (StringUtils.isEmpty(decryptToString)) {

logger.info("支付回調(diào)失敗清笨,參數(shù)解密錯(cuò)誤");

? ? ? ? }

logger.info("【支付分支付回調(diào)解密結(jié)果:】" + decryptToString);

? ? ? ? // 用戶確認(rèn)成功

? ? ? ? if ("PAYSCORE.USER_CONFIRM".equals(notifyIn.get("event_type"))) {

JSONObject json=JSONObject.parseObject(decryptToString);

? ? ? ? ? ? if("USER_CONFIRM".equals(json.getString("state_description"))){

logger.info("用戶確認(rèn)成功[【YES】],解密數(shù)據(jù){}",json);

? ? ? ? ? ? ? ? return payPointService.receiveBack(0,json);

? ? ? ? ? ? }

}

// 支付成功

? ? ? ? if ("PAYSCORE.USER_PAID".equals(notifyIn.get("event_type"))) {

JSONObject json=JSONObject.parseObject(decryptToString);

? ? ? ? ? ? if("MCH_COMPLETE".equals(json.getString("state_description"))){

logger.info("用戶支付成功[【YES】],解密數(shù)據(jù){}",json);

? ? ? ? ? ? ? ? return payPointService.receiveBack(1,json);

? ? ? ? ? ? }

}

}catch (Exception e) {

logger.error("微信支付回調(diào)處理異常器腋," + e.toString());

? ? ? ? e.printStackTrace();

? ? }

return null;

}

注意:此處的IPV3key是IPV3支付密鑰溪猿,從商戶獲取。

APIV3解密Util

回調(diào)包含了用戶確認(rèn)支付分免押和支付回調(diào)纫塌,

用戶確認(rèn)即可執(zhí)行業(yè)務(wù)操作诊县,例如:使用免押充電寶的彈出,使用共享單車的開鎖等措左。

支付回調(diào)則需要根據(jù)扣款金額校驗(yàn)依痊,微信API都是以分為單位

使用傳輸時(shí)乘以100,使用BigDecimal.multiply(new BigDecimal(100)).setScale(0)怎披;

解密時(shí)除以100胸嘁,使用BigDecimal.divide(new BigDecimal(100));

小數(shù)點(diǎn)可以自己控制,如果使用int或double容易造成精度丟失凉逛,涉及金錢務(wù)必使用BigDecimal性宏;

另外如有扣費(fèi)需要存儲(chǔ)扣費(fèi)憑證(交易單號(hào),支付分API使用基礎(chǔ)的微信退款)状飞,包裹了很多層

json數(shù)據(jù)為解密后的支付訂單回調(diào)數(shù)據(jù)毫胜;

JSONObject collection = JSONObject.parseObject(JSONObject.toJSONString(json.get("collection")));

JSONArray details = JSONObject.parseArray(collection.getString("details"));

String finish_transaction_id =null;

if (details.size() ==1) {

for (Object de : details) {

JSONObject jsons = JSONObject.parseObject(JSONObject.toJSONString(de));

? ? ? ? finish_transaction_id = jsons.getString("transaction_id");

? ? }

}

再把finish_transaction_id存儲(chǔ)书斜;

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市酵使,隨后出現(xiàn)的幾起案子荐吉,更是在濱河造成了極大的恐慌,老刑警劉巖口渔,帶你破解...
    沈念sama閱讀 206,378評論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件样屠,死亡現(xiàn)場離奇詭異,居然都是意外死亡缺脉,警方通過查閱死者的電腦和手機(jī)痪欲,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,356評論 2 382
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來枪向,“玉大人勤揩,你說我怎么就攤上這事咧党∶鼗祝” “怎么了?”我有些...
    開封第一講書人閱讀 152,702評論 0 342
  • 文/不壞的土叔 我叫張陵傍衡,是天一觀的道長深员。 經(jīng)常有香客問我,道長蛙埂,這世上最難降的妖魔是什么倦畅? 我笑而不...
    開封第一講書人閱讀 55,259評論 1 279
  • 正文 為了忘掉前任,我火速辦了婚禮绣的,結(jié)果婚禮上叠赐,老公的妹妹穿的比我還像新娘。我一直安慰自己屡江,他們只是感情好芭概,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,263評論 5 371
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著惩嘉,像睡著了一般罢洲。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上文黎,一...
    開封第一講書人閱讀 49,036評論 1 285
  • 那天惹苗,我揣著相機(jī)與錄音,去河邊找鬼耸峭。 笑死桩蓉,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的劳闹。 我是一名探鬼主播触机,決...
    沈念sama閱讀 38,349評論 3 400
  • 文/蒼蘭香墨 我猛地睜開眼帚戳,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了儡首?” 一聲冷哼從身側(cè)響起片任,我...
    開封第一講書人閱讀 36,979評論 0 259
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎蔬胯,沒想到半個(gè)月后对供,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 43,469評論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡氛濒,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 35,938評論 2 323
  • 正文 我和宋清朗相戀三年产场,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片舞竿。...
    茶點(diǎn)故事閱讀 38,059評論 1 333
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡京景,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出骗奖,到底是詐尸還是另有隱情确徙,我是刑警寧澤,帶...
    沈念sama閱讀 33,703評論 4 323
  • 正文 年R本政府宣布执桌,位于F島的核電站鄙皇,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏仰挣。R本人自食惡果不足惜伴逸,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,257評論 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望膘壶。 院中可真熱鬧错蝴,春花似錦、人聲如沸颓芭。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,262評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽畜伐。三九已至馍惹,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間玛界,已是汗流浹背万矾。 一陣腳步聲響...
    開封第一講書人閱讀 31,485評論 1 262
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留慎框,地道東北人良狈。 一個(gè)月前我還...
    沈念sama閱讀 45,501評論 2 354
  • 正文 我出身青樓,卻偏偏與公主長得像笨枯,于是被迫代替她去往敵國和親薪丁。 傳聞我的和親對象是個(gè)殘疾皇子遇西,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,792評論 2 345

推薦閱讀更多精彩內(nèi)容