Java版開發原生App支付

個人資源與分享網站:http://xiaocaoshare.com/

微信開發者平臺網址:https://open.weixin.qq.com/

微信支付開發前要先去開發者平臺創建移動應用,獲取APPID和祕鑰,然後申請獲取支付接口能力(個人無法申請,必須企業才能申請),申請商戶號

業務流程:

APP支付時序圖

後臺主要做的接口:

1.調用微信的統一下單接口,獲取預支付訂單支付信息和簽名

2.支付成功回調接口的處理

/**
     * 微信支付接口(調用統一下單接口)
     * 
     * @param totalAmount
     *            總金額
     * @param description
     *            商品描述
     * @param request
     * @return
     * @throws UnsupportedEncodingException
     */
    @ApiOperation(value = "獲取預付單信息和簽名")
    @GetMapping("getSign")
    @ResponseBody
    public ErrorObject getSign(@RequestParam BigDecimal totalAmount, @RequestParam String description, String deedsn,
            HttpServletRequest request) throws UnsupportedEncodingException {
        ErrorObject error = new ErrorObject();
        // 訂單號
        String tradeNo = UUID.randomUUID().toString().replaceAll("-", "").toLowerCase().substring(0, 32);
        // 回調地址
        String notifyUrl = currentPath + "/api/v2/wx/json/money/wxpay/succ";
        // 自定義參數
        Long userId = 100L; // 對應用戶id自己修改
        JSONObject jsAtt = new JSONObject();
        jsAtt.put("uid", userId);
        String attach = jsAtt.toJSONString();
        // 返回預支付參數
        SortedMap<String, Object> map = new TreeMap<>();
        map = PayCommonUtil.WxPublicPay(tradeNo, totalAmount, description, attach, notifyUrl, request);
        WxPayDto dto = new WxPayDto();
        dto.setAppid((String) map.get("appId"));
        dto.setPartnerid((String) map.get("partnerid"));
        dto.setPrepayid((String) map.get("prepayid"));
        dto.setPackage((String) map.get("package"));
        dto.setNoncestr((String) map.get("nonceStr"));
        dto.setTimestamp(map.get("timeStamp") + "");

        // 獲取二次簽名sign
        SortedMap<String, Object> parameterMap = new TreeMap<>();
        parameterMap.put("appid", dto.getAppid());
        parameterMap.put("noncestr", dto.getNoncestr());
        parameterMap.put("package", dto.getPackage());
        parameterMap.put("partnerid", dto.getPartnerid());
        parameterMap.put("prepayid", dto.getPrepayid());
        parameterMap.put("timestamp", dto.getTimestamp());
        String sign = PayToolUtil.createSign("UTF-8", parameterMap, PayCommonUtil.API_KEY);
        dto.setSign(sign);
        error.setMap(UtilPublic.toModelMap(dto));
        // 生成訂單
        TblOrder order = new TblOrder();
        order.setBizOrderNo(tradeNo);// 訂單號
        order.setPayStatus((byte) 0);
        order.setAmount(totalAmount.longValue());// 商品金額
        order.setGoodsName(description);// 商品名稱
        order.setDeedsn(deedsn);
        TblUser user = TblUserHelper.currentUser();
        if (user == null) {
            error.setSuccess(false);
            error.setMsg("token失效,請重新登錄!");
            return error;
        }
        order.setUid(user.getUid());
        tblOrderService.save(order);
        return error;
    }

 

@ApiOperation(value = "支付成功回調地址")
    @PostMapping("/json/money/wxpay/succ")
    public String wxpaySucc(HttpServletRequest request) throws IOException {
        log.info("微信支付成功異步通知參數:");
        InputStream inStream = request.getInputStream();
        ByteArrayOutputStream outSteam = new ByteArrayOutputStream();
        byte[] buffer = new byte[1024];
        int len = 0;
        while ((len = inStream.read(buffer)) != -1) {
            outSteam.write(buffer, 0, len);
        }
        String resultxml = new String(outSteam.toByteArray(), "utf-8");
        Map<String, String> params = null;
        try {
            params = PayCommonUtil.doXMLParse(resultxml);
        } catch (JDOMException e) {
            e.printStackTrace();
        }
        outSteam.close();
        inStream.close();
        if (!PayCommonUtil.isTenpaySign(params)) {
            // 支付失敗
            return "fail";
        } else {
            log.info("===============付款成功==============");
            // ------------------------------
            // 處理業務開始
            // ------------------------------
            // 此處處理訂單狀態,結合自己的訂單數據完成訂單狀態的更新
            // ------------------------------
            log.warn("微信付款成功:");
            log.warn("微信支付成功異步通知參數:");
            String total_fee = params.get("total_fee");// 總金額
            log.warn("total_fee= {}", total_fee);
            double v = Double.valueOf(total_fee) / 100;
            // 取出用戶id
            String attach = params.get("attach");
            String out_trade_no = params.get("out_trade_no");// 商戶訂單號
            String openid = params.get("openid");
            log.warn("out_trade_no= {}", out_trade_no);
            log.warn("openid= {}", openid);
            TblOrder order = tblOrderService.findByBizOrderNo(out_trade_no);
            order.setPayStatus((byte) 1);
            tblOrderService.save(order);
            // TODO修改合同狀態並同步到erp
            return "success";
        }
    }

完整代碼的截圖:

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章