Air
2024-11-04 a1f06d31b7b4cac569c34bdfbb68de77f2858ffe
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
package com.nova.sankuai.infra.utils.huifubao;
 
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 org.w3c.dom.Document;
import org.w3c.dom.Element;
import org.w3c.dom.NodeList;
import org.xml.sax.InputSource;
 
import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import java.io.StringReader;
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.HashMap;
import java.util.Map;
 
/**
 *
 * 该接口为快捷发送支付短信接口,需要获取到响应然后解密
 * 拿到hy_token_id去调确认支付
 *
 */
 
public class SendPaySMS {
    public static void main(String[] args) throws Exception {
        Date now = new Date();
        // 创建 SimpleDateFormat 对象,指定日期格式
        SimpleDateFormat dateFormat = new SimpleDateFormat("yyyyMMddHHmmss");
        String timestamp = dateFormat.format(now);
 
        //商户编号,(汇付宝商户内码:七位整数数字)
        String agent_id = "1664502";
 
        //二级商户号,传了要参与签名(集团商户模式)
        String ref_agent_id = "";
        //是否分润单,传了要参与签名(集团商户模式;分润单需要调分润接口,不然不会结算)
        String is_guarantee = "1";
 
        //版本号,固定为1
        String version = "1";
        //商户订单号
        String agent_bill_id = timestamp;
        //商户订单时间,格式为"yyyyMMddhhmmss"
        String agent_bill_time = timestamp;
        //支付金额,单位:元,保留二位小数
        String pay_amt = "0.01";
        //商品名称,中文UTF-8处理
        String goods_name = "手机";
        //授权码
        String hy_auth_uid = "";
        //用户IP地址
        String user_ip = "127.168.0.1";
        //支付后返回的商户处理页面,URL参数是以http://或https://开头的完整URL地址(后台处理),提交的url地址必须外网能访问到,否则无法通知商户。值可以为空,但不可以为null。
        String notify_url = "https://pay.heepay.com/test/testreceive.aspx";
 
        //拼接待加密签名参数
 
        String signStr = "agent_bill_id=" + agent_bill_id +
                        "&agent_bill_time=" + agent_bill_time +
                        "&agent_id=" + agent_id +
                        "&goods_name=" + goods_name +
                        "&hy_auth_uid=" + hy_auth_uid +
                        "&is_guarantee=" +is_guarantee +
                        "&notify_url=" + notify_url +
                        "&pay_amt=" + pay_amt +
                        "&ref_agent_id=" + ref_agent_id +
                        "&user_ip=" + user_ip +
                        "&version=" + version;
 
        System.out.println("待加密签名串:--------->" + signStr);
 
        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(signStr, heepayPublicKey);
        //加签
        String sign = signEncrypt.sign(signStr, privateKey);
 
        Map<String, String> map = new HashMap<>();
        map.put("encrypt_data", "M0nXaesynRk2LvdHcFNa3cVQULvoV6k7GfQbi6eF91e6qbQAxjA8jPB/yxf/brfgvXO+bPTs7qVK9YecwHQVh6+TlBJ+QGV60fQ/dUJJNY8U4FxuqwLG4uVoOcKc16tc2yRWk1PeSrY+g4eJALjiBYaPGpSS1NNfpx9l6CPdP1qA5Jf5xsJdoB+zMyJ0S5uJPy/J2mzjrMHpEZamfjXO5kNt+0cw6RDTDW4s+mQflUldQgpc/naasli2PQRKfpE8Ido3rezipYHyGvWktjHib3g0bBnnOTS1wBmHlCDiTaUXSJb2KIRnZOWABG/rD4NO4EDU7RoqUx9YtlZ6dlhNYpmN3mfArE2KP7+rkWWhFWilmZ+T2bUAdIpqTK03gA4FoKc3Lfdp6XGm2UhlEkBIgHxoIX3G+Kathiog8DxImmAzze0WkrGCVZQdERIewvmxGuIjwij4GbLnlejD0+7N3YBtuxf6xU6x3wnGlAotEcfggV9SAKACnQjslGr9+GCjxsPMduLAuUcAZHdvqibsqOjQLi/Qy7gbx2UL2ENZY41NzRdrBLXaQ0sLgEdscWQisUBm+OWjZBczDDBVnX4cd5LnbA6ozqegcvQHamPMMnLOnbABGkYH2PF2RuTYy56Zw9/RIZYuUxrYaz52RsiHtluY32X6oYu8QReCjfCXbGY9uuO19oLm71QkTH21JgI0vFjCLYFXVWCVDDeaipiOL+JPaXymo5OQ8QIHa4Ch+7mos/2ytTgRbaXaGYe55beejaFS3tesrbcEDt5z8Hgb1hC2Fy0KGuh30x0vR7d/UKe5AxKcFvatbcSKQObahXJdtVbwIh8jBm1WvyVBQ4xAJOKAEC6WxERynCO6Rg03MPypp0bXCLuC6fLPAu30zf/SFqOyCSOeEQbgqm77xwp7xlo7/no08KVwKLl1NgiulgrEOcvmTmN8gpjeW+wzMkBRhlINTbTHrzybhWSSx7oU/ij+Qm+55XVkGwqCoEkjFlnGR6IWZUpqQMEBLHT6vpD+eHjrzDpIROB9tgia/vN6SQMjUrrRlDW4FKTN/0amXmx9BVKu5/KicmOmJnuO/NiWs2Xfw9FLIuL8t/u9A23ewkdVIHxTKWTLNQcg91qP3U8KDZeEVSuK0qfbMvUVx3okDmNC66jFKsFvgPvkq2cbxqwMpL9qCtgetF/7YsECmzUdSa7+CLBtHhh78ExLlv/kOGjM7m2hVn2hketaV6pz6RTao7SBlW+E5qtUvrRytVUlkiz2C/51QycMuntrrOVxYzVlVJL9LR6NqjqIrH3flLdWDWCDstADMm0C/sWtTXgfHkC2sZmZCbN6p764JA7EQls2lbibkM7aluWN/Q2Q2Q==");
        map.put("agent_id","2252623");
        map.put("sign","DzvRr5UiZiLN9/EGw/tsi9KpyL9DMNHolTfmyNpuIr5nczWmnwNBFJtER4AVeDZ7cy2+EJ20eXr4MsE0fSH05hjXBDJ4mHnVJJlPKKNBiwOZtVk1iVYWwTP+hZC2ghk40oxG4y8Rewr29mfDgcfZqDz/uJK9MW7AohazXYeqWBZqbWIbm+3gR2e7bfKeHd3OkwqwdG6nI9ojH46sevmfsnXpxcpSQW5kIPjIPIl29EPXh8bzoQgi3A22rl2M+fnQsMugfAqssBjbHKR81nUKsz7dOVSmG6rKJYGM1RdCERFHZwYHxkXfqPq5YqePffeIN7gLAJ8PJ6l3DRKpubMM+w==");
 
        System.out.println("请求参数:--------->" + map);
 
        String Result = HttpUtil.sendPost("Https://Pay.Heepay.com/WithholdAuthPay/SendPaySMS.aspx",map);
        System.out.println("响应参数:--------->" + Result);
 
        try {
            DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
            DocumentBuilder builder = factory.newDocumentBuilder();
 
            InputSource inputSource = new InputSource(new StringReader(Result));
            Document document = builder.parse(inputSource);
 
            // 提取节点的值
            String retMsg = getElementValue(document, "ret_msg");
            String encryptData = getElementValue(document, "encrypt_data");
 
            if ("已经发送短信验证码".equals(retMsg)){
                String a = signEncrypt.decrypt(encryptData,privateKey);
                String[] pairs = a.split("&");
                for (String pair : pairs ){
                    String[] keyValue = pair.split("=");
                    if (keyValue.length == 2 && "hy_token_id".equals(keyValue[0])) {
                        String hy_token_id = keyValue[1];
                        //hy_token_id为支付订单创建成功的标记,确定支付需要用上
                        System.out.println("hy_token_id的值: " + hy_token_id);
                        break;  // 如果找到目标键,可以提前结束循环
                    }else {
                        // 处理未成功分割的情况
                        System.out.println("无效的键值对: " + pair);
                    }
                }
            }else {
                System.out.println("错误信息:--------->"+retMsg);
            }
 
        } catch (Exception e) {
            e.printStackTrace();
        }
 
    }
 
 
 
    private static String getElementValue(Document document, String tagName) {
        NodeList nodeList = document.getElementsByTagName(tagName);
        if (nodeList.getLength() > 0) {
            Element element = (Element) nodeList.item(0);
            return element.getTextContent();
        }
        return null;
    }
}