二 微信支付分对接(java)

1.支付分对接时注意的坑

创建支付分订单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

完结支付分订单API    https://api.mch.weixin.qq.com/v3/payscore/serviceorder/{out_order_no}/complete

注:划删除线的部分是在url上拼接path的,并且传输时param不可包含 out_order_no这个参数。

所以,我作了如下处理:


根据api替换参数,并且移除param的out_order_no

回调处理 :

@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("【微信支付分回调】{}" , callBackIn);

        JSONObject notifyIn = JSONObject.parseObject(callBackIn);

        if (notifyIn ==null) {

logger.info("支付回调失败,参数不正确,反序列化失败");

        }

//解密回调信息

        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("支付回调失败,参数解密错误");

        }

logger.info("【支付分支付回调解密结果:】" + decryptToString);

        // 用户确认成功

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

JSONObject json=JSONObject.parseObject(decryptToString);

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

logger.info("用户确认成功[【YES】],解密数据{}",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】],解密数据{}",json);

                return payPointService.receiveBack(1,json);

            }

}

}catch (Exception e) {

logger.error("微信支付回调处理异常," + e.toString());

        e.printStackTrace();

    }

return null;

}

注意:此处的IPV3key是IPV3支付密钥,从商户获取。

APIV3解密Util

回调包含了用户确认支付分免押和支付回调,

用户确认即可执行业务操作,例如:使用免押充电宝的弹出,使用共享单车的开锁等。

支付回调则需要根据扣款金额校验,微信API都是以分为单位

使用传输时乘以100,使用BigDecimal.multiply(new BigDecimal(100)).setScale(0);

解密时除以100,使用BigDecimal.divide(new BigDecimal(100));

小数点可以自己控制,如果使用int或double容易造成精度丢失,涉及金钱务必使用BigDecimal;

另外如有扣费需要存储扣费凭证(交易单号,支付分API使用基础的微信退款),包裹了很多层

json数据为解密后的支付订单回调数据;

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存储;

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 204,684评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 87,143评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 151,214评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,788评论 1 277
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,796评论 5 368
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,665评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,027评论 3 399
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,679评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 41,346评论 1 299
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,664评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,766评论 1 331
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,412评论 4 321
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,015评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,974评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,203评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,073评论 2 350
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,501评论 2 343

推荐阅读更多精彩内容