BlogJava 聯(lián)系 聚合 管理  

          Blog Stats

          文章分類

          文章檔案


          xwgong

          向javaEE前進(jìn)

          一,銀聯(lián)支付的整體流程

          客戶端提供服務(wù)器給服務(wù)器訂單信息----服務(wù)器端拿到數(shù)據(jù)推送給銀聯(lián)指定的地址----銀聯(lián)給服務(wù)器端返回一個流水賬號----服務(wù)器將流水賬號返給客戶端
          ----客戶端由于集成了銀聯(lián)控件,根據(jù)流水賬號調(diào)用銀聯(lián)支付界面進(jìn)行支付----支付完成之后銀聯(lián)會回調(diào)服務(wù)器端提供的回調(diào)地址----服務(wù)器端根據(jù)回調(diào)參數(shù)處理業(yè)務(wù)邏輯

          二,服務(wù)器端主要代碼解析.

          upmp.properties

          security.key=******//銀聯(lián)技術(shù)給我們提供的商戶密鑰
          mer.id=88000000000***** //商戶的銀聯(lián)賬號

          mer.back.end.url=/servlet/unionpaycallback//支付成功后銀聯(lián)的回調(diào)地址
          mer.front.end.url=http://www.yourdomain.com/your_path/yourFrontEndUrl//支付成功后銀聯(lián)回調(diào)的前段地址,可不填

          # message info
          version=1.0.0//版本號
          charset=UTF-8//編碼
          sign.method=MD5//加密方法

          # server url
          upmp.trade.url=http://222.66.233.198:8080/gateway/merchant/trade//處理交易請求的銀聯(lián)地址
          upmp.query.url=http://222.66.233.198:8080/gateway/merchant/query//查詢交易的銀聯(lián)地址

          card=6226440123456785//銀聯(lián)提供的測試賬戶
          password=111101//銀聯(lián)提供的測試密碼

           下面是給銀聯(lián)推送訂單的代碼.
          /**
            * 銀聯(lián)支付推送給銀聯(lián)
            */
           public String executeUnionPayMoney(String auth, String info, String basePath) {
            //returnMap--返回的Map
            //returnParams--定義的參數(shù)返回類型
            Map<String,Object> returnMap = new HashMap<String,Object>();
            String result ="";
            try{
             //把info中的信息解析成map
             @SuppressWarnings("unchecked")
             Map<String,Object> map = JSON.parseObject(info, Map.class);
             OrderDao orderDao = (OrderDao) ac.getBean("orderDao");
             if(map.get("order_id")!=null&&!map.get("order_id").equals("")&&
               map.get("user_id")!=null&&!map.get("user_id").equals("")&&
               map.get("payMoney")!=null&&!map.get("payMoney").equals("")){
              //把訂單數(shù)據(jù)推給銀聯(lián)(訂單推送接口),根據(jù)返回結(jié)果是否為true
              Order order = orderDao.getById(Long.valueOf(map.get("order_id").toString()));
              Map<String, String> req = new HashMap<String, String>();
              Map<String, String> reqReservedMap = new HashMap<String, String>();
                 reqReservedMap.put("user_id", map.get("user_id").toString());
                 reqReservedMap.put("order_id", map.get("order_id").toString());
                 reqReservedMap.put("opt", "0");//自己自定義的參數(shù),把Map轉(zhuǎn)換成json字符串,通過請求方保留域reqReserved傳遞給銀聯(lián),方便銀聯(lián)回調(diào)服務(wù)器時,服務(wù)器處理業(yè)務(wù)邏輯使用
              req.put("version", UpmpConfig.VERSION);// 版本號
              req.put("charset", UpmpConfig.CHARSET);// 字符編碼
              req.put("transType", "01");// 交易類型
              req.put("merId", UpmpConfig.MER_ID);// 商戶代碼
              //req.put("backEndUrl",basePath.substring(0, basePath.length()-1) + UpmpConfig.MER_BACK_END_URL);// 通知URL
              req.put("backEndUrl",basePath.substring(0, basePath.length()-1) + UpmpConfig.MER_BACK_END_URL);// 通知URL  我自己提供給銀聯(lián)支付成功后的回調(diào)地址
              req.put("frontEndUrl", UpmpConfig.MER_FRONT_END_URL);// 前臺通知URL(可選)
              req.put("orderDescription", "航空機(jī)票付款");// 訂單描述(可選)
              req.put("orderTime", new SimpleDateFormat("yyyyMMddHHmmss").format(new Date()));// 交易開始日期時間yyyyMMddHHmmss
              req.put("orderTimeout", "");// 訂單超時時間yyyyMMddHHmmss(可選);默認(rèn)的是一小時
              req.put("orderNumber", orderDao.getById(Long.valueOf(map.get("order_id").toString())).getOrderNum());//訂單號(商戶根據(jù)自己需要生成訂單號)
              req.put("orderAmount", Integer.valueOf(map.get("payMoney").toString())*100+"");// 訂單金額;因?yàn)檫@里默認(rèn)的單位是分,而通常客戶端傳過來的單位是元,所以需要再此
          //處進(jìn)行*100的操作,防止因?yàn)閱挝粨Q算導(dǎo)致支付出現(xiàn)問題,需要注意的是:銀聯(lián)回調(diào)時你如果從回調(diào)的參數(shù)中拿settleAmount,記得進(jìn)行除100的操作
                    req.put("orderCurrency", "156");// 交易幣種(可選) 156代表人民幣
                    req.put("reqReserved", new Gson().toJson(reqReservedMap));// 請求方保留域(可選,用于透傳商戶信息)//此處用于傳遞咱們自己的參數(shù),可以再銀聯(lián)回調(diào)時使用,
          //此處我是以json字符串的方式傳遞參數(shù)的,之后解析json字符串即可獲取相關(guān)參數(shù).

              Map<String, String> resp = new HashMap<String, String>();
              boolean validResp = UpmpService.trade(req, resp);
             if(order.getPayState()==0){
              returnMap.put("errcode",-98);
              returnMap.put("msg","該訂單已支付");
             }else{
                    // 商戶的業(yè)務(wù)邏輯
                    if (validResp){
                        // 服務(wù)器應(yīng)答簽名驗(yàn)證成功
                     returnMap.put("tn", resp.get("tn"));//交易流水號,默認(rèn)的參數(shù)就是tn
                     returnMap.put("errcode",0);
               returnMap.put("msg","成功返回流水號");
                    }else {
                        // 服務(wù)器應(yīng)答簽名驗(yàn)證失敗
                     returnMap.put("errcode",-100);
               returnMap.put("msg","系統(tǒng)出錯");
                    }
             }
             }else {
              returnMap.put("errcode",-9);
              returnMap.put("msg","傳值錯誤");
             }
             
            }catch (Exception e) {
             e.printStackTrace();
             returnMap.put("errcode",-99);
             returnMap.put("msg","服務(wù)器出現(xiàn)異常");
            }
            result=JSON.toJSONString(returnMap);
            return result;
           }

          CallBackUnionPay.java
          這個是我自己寫的一個銀聯(lián)回調(diào)的servlet,opt為自定義參數(shù),opt=0代表支付訂單,opt=1代表充值操作

          /**
           * Alipay.com Inc.
           * Copyright (c) 2005-2008 All Rights Reserved.
           */
          package com.unionpay.upmp.sdk.callback;

          import java.io.IOException;
          import java.io.PrintWriter;
          import java.util.Date;
          import java.util.HashMap;
          import java.util.Iterator;
          import java.util.Map;

          import javax.servlet.http.HttpServlet;
          import javax.servlet.http.HttpServletRequest;
          import javax.servlet.http.HttpServletResponse;

          import org.apache.commons.logging.Log;
          import org.apache.commons.logging.LogFactory;

          import com.airplane.base.AbstractExecution;
          import com.airplane.dao.AccountDao;
          import com.airplane.dao.IntegralDao;
          import com.airplane.dao.OrderDao;
          import com.airplane.dao.UserDao;
          import com.airplane.domain.Account;
          import com.airplane.domain.Integral;
          import com.airplane.domain.Order;
          import com.airplane.domain.User;
          import com.google.gson.Gson;
          import com.unionpay.upmp.sdk.service.UpmpService;

          /**
           * 接收通知并處理
           *
           * @author gxw
           */
          public class CallBackUnionPay extends HttpServlet {


              private static final long                          serialVersionUID = 7216412938937049671L;
              private static Log logger = LogFactory.getLog(CallBackUnionPay.class);

              @SuppressWarnings("unchecked")
           public void doPost(HttpServletRequest request, HttpServletResponse response){
               logger.info("==============================here===========================");
               System.out.println("接收到通知!");
               PrintWriter out;
            try {
             out = response.getWriter();
               Map<String,String> params = new HashMap<String,String>();
               Map requestParams = request.getParameterMap();
               logger.info("request的參數(shù):"+requestParams);
               for (Iterator iter = requestParams.keySet().iterator(); iter.hasNext();) {
                String name = (String) iter.next();
                String[] values = (String[]) requestParams.get(name);
                String valueStr = "";
                for (int i = 0; i < values.length; i++) {
                 valueStr = (i == values.length - 1) ? valueStr + values[i]
                   : valueStr + values[i] + ",";
                }
                params.put(name, valueStr);
               }
               logger.info("request處理后的參數(shù):"+params);
               Map<String,String> personParams = new Gson().fromJson(params.get("reqReserved"), Map.class);//解析在上一步自定義的json參數(shù),方便處理業(yè)務(wù)邏輯.
               if(UpmpService.verifySignature(params)){// 服務(wù)器簽名驗(yàn)證成功
                //請在這里加上商戶的業(yè)務(wù)邏輯程序代碼
                  if("0".equals(personParams.get("opt"))){
             String user_id = personParams.get("user_id");
             String order_id = personParams.get("order_id");
             logger.info("user_id"+user_id+"&order_id="+order_id);
                //獲取通知返回參數(shù),可參考接口文檔中通知參數(shù)列表(以下僅供參考)
                String transStatus = request.getParameter("transStatus");// 交易狀態(tài)
                if (null != transStatus && transStatus.equals("00")) {
                    // 交易處理成功
               }
                out.println("success");
               }
               if("1".equals(personParams.get("opt"))){
             String payMoney2 = params.get("settleAmount");
             String user_id2 = personParams.get("user_id");
                //獲取通知返回參數(shù),可參考接口文檔中通知參數(shù)列表(以下僅供參考)
                String transStatus2 = request.getParameter("transStatus");// 交易狀態(tài)
                if (null != transStatus2 && transStatus2.equals("00")) {
                    // 交易處理成功
                }
                out.println("success");
               }
               else{// 服務(wù)器簽名驗(yàn)證失敗
                out.println("fail");
               }
               }
               
            }catch (IOException e) {
             e.printStackTrace();
             logger.error(e);
            }
              }
              /*public void doGet(HttpServletRequest request, HttpServletResponse response) throws IOException {
               doPost(request, response);
           }*/
          }

           

          posted on 2013-09-24 14:47 龔小偉 閱讀(7451) 評論(3)  編輯  收藏 所屬分類: 支付

          評論

          # re: java服務(wù)器端移動銀聯(lián)支付的流程 2013-12-17 15:59 D調(diào)琴弦
          boolean validResp = UpmpService.trade(req, resp); 中UpmpService這是銀聯(lián)的開發(fā)包的類啊?還是您自己寫的一個工具類啊?  回復(fù)  更多評論
            

          # re: java服務(wù)器端移動銀聯(lián)支付的流程 2013-12-17 20:17 gxw
          UpmpService這個銀聯(lián)開發(fā)包提供的類,資料下載地址:http://120.204.69.168/docs/
          @D調(diào)琴弦
            回復(fù)  更多評論
            

          # re: java服務(wù)器端移動銀聯(lián)支付的流程 2014-06-16 15:24 fefe
          fwefwef  回復(fù)  更多評論
            


          只有注冊用戶登錄后才能發(fā)表評論。


          網(wǎng)站導(dǎo)航:
           
          主站蜘蛛池模板: 汶上县| 永康市| 郸城县| 阜新市| 密云县| 尉犁县| 清远市| 林甸县| 乃东县| 土默特左旗| 怀仁县| 洛扎县| 青海省| 渭源县| 双江| 洪泽县| 囊谦县| 额济纳旗| 淅川县| 红原县| 南丹县| 南木林县| 资源县| 丰都县| 新龙县| 沂水县| 惠安县| 昌图县| 桃园市| 贵德县| 西平县| 迁安市| 潮州市| 海林市| 巫溪县| 民丰县| 漠河县| 淅川县| 汕尾市| 山阳县| 东乡县|