fs-danaus
2021-08-27 35603c9d2edd3ba95f80a90d2a6cafd0caf5b1b8
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
package com.yc.abc.utils;
 
import com.abc.pay.client.Constants;
import com.abc.pay.client.JSON;
import com.abc.pay.client.ebus.AlipayRequest;
import com.abc.pay.client.ebus.PaymentRequest;
import com.abc.pay.client.ebus.QRPayCode;
import com.abc.pay.client.ebus.UnifiedPaymentRequest;
import com.yc.abc.entity.MerchantEntity;
import com.yc.abc.entity.OrderEntity;
import com.yc.entity.DataSourceEntity;
import com.yc.exception.ApplicationException;
import com.yc.factory.FactoryBean;
import com.yc.multiData.MultiDataSource;
import com.yc.multiData.SpObserver;
import com.yc.open.mutual.controller.MutualController;
import com.yc.sdk.weixinmp.util.MD5Util;
import org.apache.commons.lang3.StringUtils;
import org.apache.poi.ss.formula.functions.FactDouble;
 
import java.math.BigDecimal;
import java.time.LocalDate;
import java.time.LocalDateTime;
import java.time.LocalTime;
import java.time.format.DateTimeFormatter;
import java.util.Base64;
import java.util.LinkedHashMap;
 
/**
 * 农行支付接口
 */
public class AbcPayUtils {
    /**
     * 01:未支付
     * 02:无回应
     * 03:微信和支付宝支付成功
     * 04:选择微信、支付宝支付时,表示农行清算成功;
     * 选择我行支付通道支付时,表示农行支付成功
     * 05:已退款
     * 07:授权确认成功
     * 00:授权已取消
     * 99:失败
     */
    public  static String getOrderStatus(String status,String payType) {
        String result="";
        switch (status) {
 
            case "01":
                result= "未支付";
                break;
            case "02":
                result= "无回应";
                break;
            case "03":
            case "04":
                result= "支付成功";
                break;
            case "05":
                result= "已退款";
                break;
            case "07":
                result= "授权确认成功";
                break;
            case "00":
                result= "授权已取消";
                break;
            default:
                result= "支付失败";
        }
        String payTypeId="";
        if("ALI_PAY".equalsIgnoreCase(payType)){
            payTypeId="支付宝";
        }else if("weixinpay".equalsIgnoreCase(payType)){
            payTypeId="微信";
        }else{
            payTypeId="掌银";
        }
    return payTypeId+result;
    }
 
    /**
     * 根据数据源id匹配TrustMerchant.properties所定义的多商户信息(商户号,商户证书储存目录,商户私钥加密密码)
     * 由配置文件定义决定,从1开始
     * MerchantID=103100070113810,123456789012345,103456464564564
     * MerchantCertFile =C:\cert\3810.pfx,C:\cert\2345.pfx,C:\cert\4564.pfx
     * MerchantCertPassword =11111111,22222222,12345678
     * //TODO 开通客户需要在这里设置好对应关系,因为1已经是卤江南使用,所以从2开始指定
     * @return
     */
    public static MerchantEntity getMerchantInfo(int dbid,int formid,String userCode,String docCode){
        //商户证书列表
        String merchantStr =AbcMerchantConfig.get("MerchantCertFile");
        if(StringUtils.isBlank(merchantStr)){
            throw new ApplicationException("商户证书列表不能为空");
        }
        final String[] merchantList = merchantStr.split(",");
        int index=0;//证书的位置
        for(int i=0;i<merchantList.length;i++){
            //根据数据源id定位对应的证书
            if(merchantList[i].contains("CA/"+dbid+"/")){
                index=i+1;
                break;
            }
        }
        if(index==0){
            final DataSourceEntity dataSourceMap = MultiDataSource.getDataSourceMap(dbid + "");
            throw new ApplicationException(dataSourceMap.getSystemID()+"-商户证书找不到,请检查配置文件");
        }
        //域名
        MutualController mutualController =(MutualController)FactoryBean.getBean("mutualController");
       String domain = "http://demo.onbus.cn:9010";//测试环境
       //String domain = "http://yc100.xicp.net:9001";//测试环境
       //String domain = mutualController.getSystemUrlByDataSource(MultiDataSource.getDataSourceMap(dbid+"")); //正式环境
        return new MerchantEntity(index,String.format("%s/abc/%s/%s/%s/%s/orderPayCallback.do",domain,dbid,formid,docCode,userCode));
 
    }
    /**
     * 向农行发送订单请求,把订单提交到网上支付平台,成功后导向支付界面,然后发起支付操作,这里只是生成支付订单,实际交易还需要调用其他接口
     *
     * @return
     */
    public static JSON createPostOrder(OrderEntity entity) {
 
        final DataSourceEntity dataSource = MultiDataSource.getDataSourceMap(entity.getDbid());
        final MerchantEntity merchantEntity = getMerchantInfo(dataSource.getDbId(),150101,entity.getInfo(),entity.getOrderNo());
        if(merchantEntity==null){
            throw  new ApplicationException(String.format("请维护好【%s】和商户信息之间的映射关系",dataSource.getSystemDescribe()));
        }
        //订单日期和时间
        LocalDate localDate = LocalDate.now();
        String date = localDate.format(DateTimeFormatter.ofPattern("yyyy/MM/dd"));
        LocalTime localTime = LocalTime.now();
        String time = localTime.format(DateTimeFormatter.ofPattern("HH:mm:ss"));
        String orderNo = entity.getOrderNo();
        //todo 订单金额
        BigDecimal orderAmount = entity.getAmount().setScale(2, BigDecimal.ROUND_HALF_UP);
        if(entity.getPayType()==0) {
             return getPaymentRequest(entity, merchantEntity, date, time, orderNo, orderAmount);
        }else{
             return createOrder(entity, merchantEntity, date, time, orderNo, orderAmount);
        }
 
    }
 
    public static JSON getPaymentRequest(OrderEntity entity, MerchantEntity merchantEntity, String date, String time, String orderNo, BigDecimal orderAmount) {
        //1、生成订单对象
        PaymentRequest tPaymentRequest = new PaymentRequest();
 
        tPaymentRequest.dicOrder.put("PayTypeID", Constants.PAY_TYPE_DIRECTPAY);                   //设定交易类型
        tPaymentRequest.dicOrder.put("OrderDate", date);                  //设定订单日期 (必要信息 - YYYY/MM/DD)
        tPaymentRequest.dicOrder.put("OrderTime", time);                   //设定订单时间 (必要信息 - HH:MM:SS)
        //tPaymentRequest.dicOrder.put("orderTimeoutDate", LocalDateTime.now().plusMinutes(10).format(DateTimeFormatter.ofPattern("yyyyMMddHHmmss")));           // 设置订单过期时间,10分钟
        tPaymentRequest.dicOrder.put("OrderNo", orderNo);                       //设定订单编号 (必要信息)
        tPaymentRequest.dicOrder.put("CurrencyCode", "156");             //设定交易币种
        tPaymentRequest.dicOrder.put("OrderAmount", orderAmount.toString());      //设定交易金额
        tPaymentRequest.dicOrder.put("InstallmentMark", "0");       // 分期标识
        tPaymentRequest.dicOrder.put("CommodityType", "0202");           // 设置商品种类
        tPaymentRequest.dicOrder.put("BuyIP", entity.getIp());           // 设置商品种类
        tPaymentRequest.dicOrder.put("OrderDesc", "收款单:"+orderNo);           // 设置商品种类
//2、订单明细
        LinkedHashMap orderitem = new LinkedHashMap();
        orderitem.put("ProductName", orderNo);//商品名称
        tPaymentRequest.orderitems.put(1, orderitem);
//3、生成支付请求对象
        tPaymentRequest.dicRequest.put("PaymentType", Constants.PAY_TYPE_ALL);            //设定支付类型
        tPaymentRequest.dicRequest.put("PaymentLinkType", Constants.PAY_LINK_TYPE_NET);    //设定支付接入方式
        tPaymentRequest.dicRequest.put("NotifyType", Constants.NOTIFY_TYPE_SERVER);              //设定通知方式
        tPaymentRequest.dicRequest.put("MerchantRemarks", getMerchantRemarks(entity));           // 附言
        //--测试环境
        //tPaymentRequest.dicRequest.put("ResultNotifyURL", "http://ljn.onbus.cn:9010/lujn/orderPayCallback.do");    //设定通知URL地址
        tPaymentRequest.dicRequest.put("ResultNotifyURL", merchantEntity.getResultNotifyURL());    //设定通知URL地址
        tPaymentRequest.dicRequest.put("IsBreakAccount", Constants.IsBreakAccount_NO);      //设定交易是否分账、交易是否支持向二级商户入账
        System.out.println(com.alibaba.fastjson.JSON.toJSONString(tPaymentRequest));
        return tPaymentRequest.extendPostRequest(merchantEntity.getIndex());
 
    }
 
    private static JSON createOrder(OrderEntity entity, MerchantEntity merchantEntity, String date, String time, String orderNo, BigDecimal orderAmount) {
        String payChannel=getChannelType(entity.getQrCode());
        if("wechat".equalsIgnoreCase(payChannel)){
            //微信支付
            return getPaymentRequestByWx(entity, merchantEntity, date, time, orderNo, orderAmount);
        }else if("alipay".equalsIgnoreCase(payChannel)){
            //支付宝支付
            return getPaymentRequestByAliPay(entity, merchantEntity, date, time, orderNo, orderAmount);
 
        }else{
            //银联支付
            return getPaymentRequestByUnionPay(entity, merchantEntity, date, time, orderNo, orderAmount);
 
        }
    }
    public static JSON getPaymentRequestByWx(OrderEntity entity, MerchantEntity merchantEntity, String date, String time, String orderNo, BigDecimal orderAmount) {
        //1、生成订单对象
        UnifiedPaymentRequest tPaymentRequest = new UnifiedPaymentRequest();
 
        tPaymentRequest.dicOrder.put("PayTypeID", Constants.PAY_TYPE_MICROPAY);                   //设定交易类型
        tPaymentRequest.dicOrder.put("OrderDate", date);                  //设定订单日期 (必要信息 - YYYY/MM/DD)
        tPaymentRequest.dicOrder.put("OrderTime", time);                   //设定订单时间 (必要信息 - HH:MM:SS)
        tPaymentRequest.dicOrder.put("OrderNo", orderNo);                       //设定订单编号 (必要信息)
        tPaymentRequest.dicOrder.put("CurrencyCode", "156");             //设定交易币种
        tPaymentRequest.dicOrder.put("OrderAmount", orderAmount.toString());      //设定交易金额
        tPaymentRequest.dicOrder.put("BuyIP", entity.getIp());           // 客户IP
        tPaymentRequest.dicOrder.put("AccountNo", entity.getQrCode());           // 付款码
        tPaymentRequest.dicOrder.put("OrderDesc", "收款单:"+orderNo);           // 商品描述
        tPaymentRequest.dicOrder.put("CommodityType", "0202");
//3、生成支付请求对象
        tPaymentRequest.dicRequest.put("PaymentType", Constants.PAY_TYPE_WX);            //设定微信支付
        tPaymentRequest.dicRequest.put("PaymentLinkType", Constants.PAY_LINK_TYPE_NET);    //设定支付接入方式
        tPaymentRequest.dicRequest.put("NotifyType", Constants.NOTIFY_TYPE_SERVER);              //设定通知方式
        tPaymentRequest.dicRequest.put("MerchantRemarks", getMerchantRemarks(entity));           // 附言
        tPaymentRequest.dicRequest.put("CommodityType", "0202");           // 设置商品种类
        //--测试环境
        //tPaymentRequest.dicRequest.put("ResultNotifyURL", "http://ljn.onbus.cn:9010/lujn/orderPayCallback.do");    //设定通知URL地址
        tPaymentRequest.dicRequest.put("ResultNotifyURL", merchantEntity.getResultNotifyURL());    //设定通知URL地址
        tPaymentRequest.dicRequest.put("IsBreakAccount", Constants.IsBreakAccount_NO);      //设定交易是否分账、交易是否支持向二级商户入账
        System.out.println(com.alibaba.fastjson.JSON.toJSONString(tPaymentRequest));
        return tPaymentRequest.extendPostRequest(merchantEntity.getIndex());
    }
 
    public static String getMerchantRemarks(OrderEntity entity) {
        return String.format("单号:%s,客户编号:%s,[%s]", entity.getOrderNo(), entity.getCltCode(), entity.getCompanyName());
    }
 
    public static JSON getPaymentRequestByAliPay(OrderEntity entity, MerchantEntity merchantEntity, String date, String time, String orderNo, BigDecimal orderAmount) {
        //1、生成订单对象
        AlipayRequest tPaymentRequest = new AlipayRequest();
 
        tPaymentRequest.dicOrder.put("PayTypeID", Constants.PAY_TYPE_ALI_PAY);                   //设定交易类型
        tPaymentRequest.dicOrder.put("OrderDate", date);                  //设定订单日期 (必要信息 - YYYY/MM/DD)
        tPaymentRequest.dicOrder.put("OrderTime", time);                   //设定订单时间 (必要信息 - HH:MM:SS)
        tPaymentRequest.dicOrder.put("OrderNo", orderNo);                       //设定订单编号 (必要信息)
        tPaymentRequest.dicOrder.put("CurrencyCode", "156");             //设定交易币种
        tPaymentRequest.dicOrder.put("OrderAmount", orderAmount.toString());      //设定交易金额
        tPaymentRequest.dicOrder.put("BuyIP", entity.getIp());           // 客户IP
        tPaymentRequest.dicOrder.put("AccountNo", entity.getQrCode());           // 付款码
        tPaymentRequest.dicOrder.put("OrderDesc", "收款单:"+orderNo);           // 商品描述
        tPaymentRequest.dicOrder.put("CommodityType", "0202");           // 设置商品种类
 
//3、生成支付请求对象
        tPaymentRequest.dicRequest.put("CommodityType", "0202");           // 设置商品种类
        tPaymentRequest.dicRequest.put("PaymentType", Constants.PAY_TYPE_ALIPAY);            //设定支付类型
        tPaymentRequest.dicRequest.put("PaymentLinkType", Constants.PAY_LINK_TYPE_NET);    //设定支付接入方式
        tPaymentRequest.dicRequest.put("NotifyType", Constants.NOTIFY_TYPE_SERVER);              //设定通知方式
        tPaymentRequest.dicRequest.put("MerchantRemarks", getMerchantRemarks(entity));
        //--测试环境
        //tPaymentRequest.dicRequest.put("ResultNotifyURL", "http://ljn.onbus.cn:9010/lujn/orderPayCallback.do");    //设定通知URL地址
        tPaymentRequest.dicRequest.put("ResultNotifyURL", merchantEntity.getResultNotifyURL());    //设定通知URL地址
        tPaymentRequest.dicRequest.put("IsBreakAccount", Constants.IsBreakAccount_NO);      //设定交易是否分账、交易是否支持向二级商户入账
        System.out.println(com.alibaba.fastjson.JSON.toJSONString(tPaymentRequest));
        return tPaymentRequest.extendPostRequest(merchantEntity.getIndex());
    }
    public static JSON getPaymentRequestByUnionPay(OrderEntity entity, MerchantEntity merchantEntity, String date, String time, String orderNo, BigDecimal orderAmount) {
        //1、生成订单对象
        QRPayCode tPaymentRequest = new QRPayCode();
 
        tPaymentRequest.dicOrder.put("PayTypeID", Constants.PAY_TYPE_DIRECTPAY);                   //设定交易类型
        tPaymentRequest.dicOrder.put("OrderDate", date);                  //设定订单日期 (必要信息 - YYYY/MM/DD)
        tPaymentRequest.dicOrder.put("OrderTime", time);                   //设定订单时间 (必要信息 - HH:MM:SS)
        tPaymentRequest.dicOrder.put("OrderNo", orderNo);                       //设定订单编号 (必要信息)
        tPaymentRequest.dicOrder.put("CurrencyCode", "156");             //设定交易币种
        tPaymentRequest.dicOrder.put("OrderAmount", orderAmount.toString());      //设定交易金额
        tPaymentRequest.dicOrder.put("InstallmentMark", "0");       // 分期标识
        tPaymentRequest.dicOrder.put("CommodityType", "0202");           // 设置商品种类
        tPaymentRequest.dicOrder.put("BuyIP", entity.getIp());           // IP
        tPaymentRequest.dicOrder.put("QRPayCode", entity.getQrCode());           // 付款码
//2、订单明细
        LinkedHashMap orderitem = new LinkedHashMap();
        orderitem.put("ProductName", orderNo);//商品名称
        tPaymentRequest.orderitems.put(1, orderitem);
//3、生成支付请求对象
        tPaymentRequest.dicRequest.put("PaymentType", Constants.PAY_TYPE_ALL);            //设定支付类型
        tPaymentRequest.dicRequest.put("PaymentLinkType", Constants.PAY_LINK_TYPE_NET);    //设定支付接入方式
        tPaymentRequest.dicRequest.put("NotifyType", Constants.NOTIFY_TYPE_SERVER);              //设定通知方式
        tPaymentRequest.dicRequest.put("MerchantRemarks", getMerchantRemarks(entity));
        //--测试环境
        //tPaymentRequest.dicRequest.put("ResultNotifyURL", "http://ljn.onbus.cn:9010/lujn/orderPayCallback.do");    //设定通知URL地址
        tPaymentRequest.dicRequest.put("ResultNotifyURL", merchantEntity.getResultNotifyURL());    //设定通知URL地址
        tPaymentRequest.dicRequest.put("IsBreakAccount", Constants.IsBreakAccount_NO);      //设定交易是否分账、交易是否支持向二级商户入账
        System.out.println(com.alibaba.fastjson.JSON.toJSONString(tPaymentRequest));
        return tPaymentRequest.extendPostRequest(merchantEntity.getIndex());
    }
    /**
     * 获取支付渠道(微信,支付宝,银联)
     * @return
     * @throws Exception
     */
    private static String getChannelType(String qrCode){
        String payChannel;
        String wx[] = { "10", "11", "12", "13", "14", "15" };
        String ali[] = { "25", "26", "27", "28", "29", "30" };
        String yl[] = {"62"};
        if (StringUtils.startsWithAny(qrCode.substring(0, 2), wx)) {
            payChannel= "wechat";
        } else if (StringUtils.startsWithAny(qrCode.substring(0, 2), ali)) {
            payChannel= "alipay";
        }else {
            payChannel= "unoinpay";
        }
        return payChannel;
    }
 
}