ab
2024-11-04 09d882262f530ded672f1c01fb65a1fefa00d52d
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
package com.nova.sankuai.infra.utils.huifubao;
 
 
import com.alibaba.fastjson.JSONObject;
import com.fasterxml.jackson.databind.JsonNode;
import com.nova.sankuai.infra.utils.huifubao.common.HttpUtil;
import com.nova.sankuai.infra.utils.huifubao.common.MyKey;
import com.nova.sankuai.infra.utils.huifubao.common.SignEncrypt;
import org.bouncycastle.util.encoders.Base64;
 
import java.security.KeyFactory;
import java.security.PrivateKey;
import java.security.PublicKey;
import java.security.spec.PKCS8EncodedKeySpec;
import java.security.spec.X509EncodedKeySpec;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.Random;
 
import static com.nova.sankuai.infra.utils.huifubao.common.HttpUtil.parseJsonResponse;
 
 
/**
快捷收银台接口,非快捷网关体系内
*/
 
public class CashierApi {
 
 
    public static void main(String[] args) throws Exception {
 
        SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
        Date now = new Date();
        String time = sdf.format(now);
        // 创建Random对象
        Random random = new Random();
        // 设置上限值
        int upperBound = 1000000000;
        // 生成随机数
        String randomNum = String.valueOf(random.nextInt(upperBound));
 
 
        String method = "heepay.bank.apply.page.pay";
        String version ="1.0";
        String sign_type = "RSA1";
        String pay_type = "63";
        //请求商户ID
        String merch_id = "1664502";
        String timestamp = time;
        String out_trade_time = time;
        String out_trade_no = randomNum;
        //异步返回的商户处理页面,URL参数是以http://或https://开头的完整URL地址(后台处理),提交的url地址必须外网能访问到,否则无法通知商户。值可以为空,但不可以为null
        String notify_url = "https://www.baidu.com/";
        String return_url = "https://www.baidu.com/";
        //商户平台用户唯一标识,自定义,一定要唯一
        String merch_user_id = "WOWOWOWO12121216616161";
        //商户平台商品名称 | 编码格式:utf-8
        String goods_name = "米饭";
        //支付金额 | 单位:元,支持小数点后两位
        double pay_amt = 0.01;
 
 
 
        /* 业务参数注意
           如果是大商户子商户模式,需要传子商户号,如果需要订单分润需要传is_profit_sharing
           并且需要放在biz里面去组装
            子商户号*/
        //String sub_merch_id ="";
        //是否指定分账 | 枚举值 true:是 false:否   传 1 或 2
        int is_profit_sharing = 1;
 
 
 
        //biz组装
        JSONObject payer_info = new JSONObject();
        payer_info.put("merch_user_id",merch_user_id);
        JSONObject goods_info = new JSONObject();
        goods_info.put("goods_name",goods_name);
        JSONObject biz_content = new JSONObject();
        biz_content.put("out_trade_no",out_trade_no);
        biz_content.put("out_trade_time",out_trade_time);
        biz_content.put("pay_type",pay_type);
 
        /* 业务参数注意
           如果是大商户子商户模式,需要传子商户号,如果需要订单分润需要传is_profit_sharing
           并且需要放在biz里面去组装
            子商户号*/
        //biz_content.put("sub_merch_id",sub_merch_id);
        biz_content.put("is_profit_sharing",is_profit_sharing);
        biz_content.put("pay_amt",pay_amt);
        biz_content.put("return_url",return_url);
        biz_content.put("notify_url",notify_url);
        biz_content.put("payer_info",payer_info);
        biz_content.put("goods_info",goods_info);
        System.out.println("加密串:--------->"+biz_content);
 
 
        //签名串组装
        String OldSign = "biz_content=" + biz_content
                + "&merch_id=" + merch_id
                +"&method=" + method
                +"&sign_type=" + sign_type
                +"&timestamp=" + timestamp
                +"&version=" + version;
 
        System.out.println("签名串:--------->"+OldSign);
 
        SignEncrypt signEncrypt = new SignEncrypt();
 
        // 使用类名和常量名来访问常量
        String publicKeystr = MyKey.publicKeystr;
        String privateKeystr = MyKey.privateKeystr;
        //密钥配置
        KeyFactory keyFactory = KeyFactory.getInstance("RSA");
        byte[] publicKeyPath = Base64.decode(publicKeystr.getBytes());
        byte[] privateKeyPath = Base64.decode(privateKeystr.getBytes());
        PublicKey heepayPublicKey = keyFactory.generatePublic(new X509EncodedKeySpec(publicKeyPath));
        PrivateKey privateKey = keyFactory.generatePrivate(new PKCS8EncodedKeySpec(privateKeyPath));
        //加密
        String content = signEncrypt.encrypt(String.valueOf(biz_content), heepayPublicKey);
        //加签
        String sign = signEncrypt.sign(OldSign, privateKey);
 
 
        //最终请求数据
        JSONObject param = new JSONObject();
        param.put("method",method);
        param.put("version",version);
        param.put("merch_id",merch_id);
        param.put("timestamp",timestamp);
        param.put("biz_content",content);
        param.put("sign_type",sign_type);
        param.put("sign",sign);
 
        HttpUtil httpUtil = new HttpUtil();
        String a = httpUtil.sendJsonHttpPost("https://Pay.Heepay.com/API/Cashier/ApplyPay.aspx", String.valueOf(param));
        //解析返回参数
        JsonNode jsonNode = parseJsonResponse(a);
        String msg = jsonNode.get("msg").asText();
 
 
        if ( "调用成功".equals(msg) ){
            String data = jsonNode.get("data").asText();
            String DecryptedData = signEncrypt.decrypt(data,privateKey);
            JsonNode DecryptedData1 = parseJsonResponse(DecryptedData);
            String redirect_uri = DecryptedData1.get("redirect_uri").asText();
            System.out.println("输出为收银台请求地址:--------->"+redirect_uri);
        }else {
            String sub_msg = jsonNode.get("sub_msg").asText();
            System.out.println("输出失败sub_msg:--------->"+sub_msg);
        }
    }
}