| New file |
| | |
| | | package com.stylefeng.guns.modular.system.util; |
| | | |
| | | import cn.hutool.http.HttpRequest; |
| | | import cn.hutool.http.HttpResponse; |
| | | import cn.hutool.http.HttpUtil; |
| | | import com.alibaba.fastjson.JSON; |
| | | import com.alibaba.fastjson.JSONObject; |
| | | import com.fasterxml.jackson.databind.ObjectMapper; |
| | | import com.huifu.bspay.sdk.opps.core.BasePay; |
| | | import com.huifu.bspay.sdk.opps.core.config.MerConfig; |
| | | import com.huifu.bspay.sdk.opps.core.utils.DateTools; |
| | | import com.huifu.bspay.sdk.opps.core.utils.SequenceTools; |
| | | import com.stylefeng.guns.core.util.HttpUtils; |
| | | import com.stylefeng.guns.modular.huifu.biz.DouGongBasicDataBiz; |
| | | import com.stylefeng.guns.modular.huifu.properties.HuiFuProperties; |
| | | import org.springframework.beans.factory.annotation.Autowired; |
| | | |
| | | import java.security.KeyFactory; |
| | | import java.security.PrivateKey; |
| | | import java.security.Signature; |
| | | import java.security.spec.PKCS8EncodedKeySpec; |
| | | import java.util.Base64; |
| | | import java.util.TreeMap; |
| | | |
| | | import static com.aliyun.oss.model.RoutingRule.Protocol.Http; |
| | | |
| | | /** |
| | | * 斗拱支付工具类 |
| | | */ |
| | | public class DouGongPayUtil { |
| | | |
| | | @Autowired |
| | | private HuiFuProperties huiFuProperties; |
| | | public static void main(String[] args) throws Exception { |
| | | // MerConfig merConfig = new MerConfig(); |
| | | // merConfig.setProcutId("KAZX"); |
| | | // merConfig.setSysId("6666000182995771"); |
| | | // merConfig.setRsaPrivateKey("MIIEvQIBADANBgkqhkiG9w0BAQEFAASCBKcwggSjAgEAAoIBAQCR6W3ynQJL7f2C8vFYMcQkcirpkif9ZhLq1374jIlV87nv0T9uIm6DoW8LyNEl9w2Yc5qoBv70tt/oVpemA6IZY6NXzE2USNi/sv2qUTtapcIRYxe4acCfY8K+x+p7W2e6wUWIpl9qgZA+UnFmHQ0HT6Ywzq2jJL92JdIs147Ud1aVi3aX8LYItj0z3ZKwZQkaJawZSWQk2+EdPfN059L2qFkPtnT7JIthAdUTJYZA13K4tzw6mXp/DbgwVmLhrlmwl/ccSv2Q0ABfEk7jIxF1nZmCmSy3HrEw9xWyrg1BC+DgXBdyF0OEtpNfv+UW080syUVBNN0irHVuDP81BaAjAgMBAAECggEAGlBZprZQErdxz6rWgYxADj6UpJjaI2XEJZwFZveZUOnqb2hyIv+MpKp5Z0upBErApey7SHAyjJlqWfE72hGvqxp/+7Z5izNz+2ZhPtT1ekyIajBPt89CkLwiA9vz2plKZLC0RIeUj5WcGNEvaDX3AomHtCehwtk+uiTp+XJKbOBtkkQszcdCGY1DVoQ0ppFoINnM9VLbEzaFaG7VS3eFkU4cf2CwcrnJB1RncyPFK+bGFvjkLM/eQbsh8YxkBqaGz/8UM1Na1SEidqdyUF71ltqnI0u8pLe0V+5jugVW+3lPL/p1C3i7mAbQOs4yqRWlFaGVTzOawoQUOPVwDpzeeQKBgQDs1P7F4wURqX1qZR0hSTqOigg48ychaOF66new3SuWk2CVBy8Q8b7odGSPyxJSGZvFLoznPYuSaXCtQ935WWfjB7Z5JpSWCi9BmJnkh41k/KvgMqAEGkZP6ul/zFnDWj94VwXEBz3TuRk574vK2coWoxjM6h1dlJjRBVVTs8dnrQKBgQCduKCjPDUuOHbcNn3VsaHEZX1XyiXN5gds08o61PjiHM42wYXxfUt59nBJmg2yAVRIrKYHfswJcxb5XUTDI5ZhCBnIPrdrQzj7FNadm/7mKDvSsvZdpfTiHY341XnvCq7OcNNj8g5fVsWF769strepQReSug7xgX7ojPvVcAZhDwKBgD57KwP2Er5IIuhQ6NCBS0uTqvurWqV70BDnjtBAaWF+XDq0/HvR63XUTzuIbbrvOqNY1p+jIxFrc+iiQQupxLimrkNkJEs5QKJjqiYahPkhmA68DG9Ip0gqR5QJy5y4UIplGwZOiscyzC72vcC0mJZETSSylzC7JV3vtEUy5ua5AoGAEwlDqjAMIyYBgpa5HV+xLKkrNbtaUL2gy8vMLsmhuHjNkuJMrlb3EyNhbiC/4moyqArehy0Qp1tSvIo7UGotLkzx/69CKBoW+IcNWDyJyXG1trqO7cKoCdqTViM98lIRwyzu9rMydONeN8o0HCT5id4nYDhAsXl1vc+2XY6F1pUCgYEA0dxGHBTKD/WzIvTYGYD6Xx224Y84mO6x2Mu16zFoq/NjuIdKi2O+92yrKDCMMCqaY77fXvWD3eI7QYYlbKAOqdLKVipTbhnBccDyNbtYHVg59t4xS+K6HyD+quVkL9n40UkxSZbKZBQhqt+vlQy0FUgONFii1ACZO0A8Sc/bvn4="); |
| | | // merConfig.setRsaPublicKey("MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAsWrruP9JBxrUd8uEX5Z8y7pg/UIr5RNHSgDnHqNI1hbi2MfTzB5vZ275wSFFaLDD9BesgDWqsUepPS/opROlDCg9y6WYH8mkN23NmHL9F8kT48OMmH722am+Hp0XVMMwXqA0oNt4f7oW6kDemjZW8/RT4vIE7cyxoxSsVRvjqSpx9wDgFLPWh3o0pHQaoxLyeUsGBATHFrxEDlosBvsuXjMcgjPKXALrcemzKOhBmBkLgyxNVmh61ZK+FNXd+/X4PeZlnWf54NRQAUKe1308E6IIaszo+CjneKuhj1m/X4f7AIvxAqlhuCV5E/DfKRmGopxaWqdtE960Y/H4SmBh2wIDAQAB"); |
| | | // BasePay.initWithMerConfig(merConfig); |
| | | // request.setReqDate(DateTools.getCurrentDateYYYYMMDD());// 请求日期 |
| | | // request.setReqSeqId(SequenceTools.getReqSeqId32()); // 请求流水号 |
| | | // request.setHuifuId("6666000109111111"); // 商户号 |
| | | // request.setGoodsDesc("上海合力批发站(货款)");// 商品描述 |
| | | // request.setTransAmt("20.00"); // 交易金额 |
| | | // request.setRemark("JSPAY:ID:102");//交易备注 |
| | | //// 设置超时时间 |
| | | // request.setTimeExpire("20250916202931"); |
| | | //// 设置异步通知地址 |
| | | // request.setNotifyUrl("https:/www.demoSite.com/api/public/hf/smstorecallback"); |
| | | //// 延迟交易能力 延迟入账标识 |
| | | // request.setDelayAcctFlag("N"); |
| | | //// 实时分账能力 设置分账信息,需要分账权限 |
| | | //// request.setAcctSplitBunch("{\"acct_infos\":[{\"div_amt\":\"4.00\",\"huifu_id\":\"666600016871111\"}," + |
| | | //// "{\"div_amt\":\"16.00\",\"huifu_id\":\"6666000169391112\"}]}"); |
| | | // |
| | | ////以下为微信小程序需要的参数 |
| | | // ObjectMapper objectMapper = JacksonUtils.getInstance(); |
| | | // String wxDataString=""; |
| | | //// {"sub_appid":"wxa350b4c0fd003192","sub_openid":"o4n3E6q8MOEQefCsGKVOAh40spNw"} |
| | | // WxData wxData = new WxData(); |
| | | // wxData.setSubOpenid("o8jhotzittQSeFF-N0Yj4Hz91Rqc"); |
| | | // wxData.setSubAppid("wx4f4f5a5f5a5f5aFF"); |
| | | ////微信相关参数可参考官方文档 https://pay.weixin.qq.com/doc/v2/merchant/4011935214 |
| | | ////复杂{"body":"香土鸡餐馆:线下支付","detail":{"cost_price":"1.0","goods_detail":[{"goods_id":"1967776038541551111","goods_name":"香土鸡餐馆:线下支付","price":"1.0","quantity":1}],"receipt_id":"1970743410445500000"},"scene_info":{"store_info":{"id":"1967776038541550000","name":"香土鸡餐馆:线下支付"}},"sub_appid":"wx969f2ef2df1111","sub_openid":"oqVX87O2I2U3rT-BBBBBBBB-YsU"} |
| | | // wxDataString = objectMapper.writeValueAsString(wxData); |
| | | // request.setTradeType("T_MINIAPP"); // 交易类型 - 微信小程序 |
| | | // Map<String, Object> response = Factory.Payment.Common() |
| | | // .optional("method_expand",wxDataString).create(request); |
| | | // System.out.println("T_JSAPI返回数据:" + JacksonUtils.convert2JsonString(response)); |
| | | |
| | | |
| | | HttpRequest post = HttpUtil.createPost("https://api.huifu.com/v4/trade/payment/create"); |
| | | String a ="{\n" + |
| | | " \"req_seq_id\": \"20250828150630498989712913\",\n" + |
| | | " \"req_date\": \"20251117\",\n" + |
| | | " \"huifu_id\": \"6666000182995771\",\n" + |
| | | " \"trade_type\": \"A_JSAPI\",\n" + |
| | | " \"combinedpay_data\": \"\",\n" + |
| | | " \"trans_amt\": \"0.01\",\n" + |
| | | " \"goods_desc\": \"支付宝Native\",\n" + |
| | | " \"remark\": \"交易备注\",\n" + |
| | | " \"time_expire\": \"\",\n" + |
| | | " \"delay_acct_flag\": \"N\",\n" + |
| | | " \"fee_flag\": \"\",\n" + |
| | | " \"acct_split_bunch\": \"\",\n" + |
| | | " \"terminal_device_data\": \"{\\\"device_ip\\\":\\\"172.28.52.52\\\",\\\"devs_id\\\":\\\"SPINTP104120617260257\\\"}\",\n" + |
| | | " \"notify_url\": \"\",\n" + |
| | | " \"method_expand\": \"{\\\"buyer_logon_id\\\":\\\"17828262728\\\"}\"\n" + |
| | | " }"; |
| | | // 去掉换行、空格等格式字符 |
| | | a = a.replaceAll("\\s", ""); |
| | | |
| | | |
| | | a = JSON.toJSONString(JSONObject.parseObject(a, TreeMap.class)); |
| | | String sign = sign(a, "MIIEvQIBADANBgkqhkiG9w0BAQEFAASCBKcwggSjAgEAAoIBAQCR6W3ynQJL7f2C8vFYMcQkcirpkif9ZhLq1374jIlV87nv0T9uIm6DoW8LyNEl9w2Yc5qoBv70tt/oVpemA6IZY6NXzE2USNi/sv2qUTtapcIRYxe4acCfY8K+x+p7W2e6wUWIpl9qgZA+UnFmHQ0HT6Ywzq2jJL92JdIs147Ud1aVi3aX8LYItj0z3ZKwZQkaJawZSWQk2+EdPfN059L2qFkPtnT7JIthAdUTJYZA13K4tzw6mXp/DbgwVmLhrlmwl/ccSv2Q0ABfEk7jIxF1nZmCmSy3HrEw9xWyrg1BC+DgXBdyF0OEtpNfv+UW080syUVBNN0irHVuDP81BaAjAgMBAAECggEAGlBZprZQErdxz6rWgYxADj6UpJjaI2XEJZwFZveZUOnqb2hyIv+MpKp5Z0upBErApey7SHAyjJlqWfE72hGvqxp/+7Z5izNz+2ZhPtT1ekyIajBPt89CkLwiA9vz2plKZLC0RIeUj5WcGNEvaDX3AomHtCehwtk+uiTp+XJKbOBtkkQszcdCGY1DVoQ0ppFoINnM9VLbEzaFaG7VS3eFkU4cf2CwcrnJB1RncyPFK+bGFvjkLM/eQbsh8YxkBqaGz/8UM1Na1SEidqdyUF71ltqnI0u8pLe0V+5jugVW+3lPL/p1C3i7mAbQOs4yqRWlFaGVTzOawoQUOPVwDpzeeQKBgQDs1P7F4wURqX1qZR0hSTqOigg48ychaOF66new3SuWk2CVBy8Q8b7odGSPyxJSGZvFLoznPYuSaXCtQ935WWfjB7Z5JpSWCi9BmJnkh41k/KvgMqAEGkZP6ul/zFnDWj94VwXEBz3TuRk574vK2coWoxjM6h1dlJjRBVVTs8dnrQKBgQCduKCjPDUuOHbcNn3VsaHEZX1XyiXN5gds08o61PjiHM42wYXxfUt59nBJmg2yAVRIrKYHfswJcxb5XUTDI5ZhCBnIPrdrQzj7FNadm/7mKDvSsvZdpfTiHY341XnvCq7OcNNj8g5fVsWF769strepQReSug7xgX7ojPvVcAZhDwKBgD57KwP2Er5IIuhQ6NCBS0uTqvurWqV70BDnjtBAaWF+XDq0/HvR63XUTzuIbbrvOqNY1p+jIxFrc+iiQQupxLimrkNkJEs5QKJjqiYahPkhmA68DG9Ip0gqR5QJy5y4UIplGwZOiscyzC72vcC0mJZETSSylzC7JV3vtEUy5ua5AoGAEwlDqjAMIyYBgpa5HV+xLKkrNbtaUL2gy8vMLsmhuHjNkuJMrlb3EyNhbiC/4moyqArehy0Qp1tSvIo7UGotLkzx/69CKBoW+IcNWDyJyXG1trqO7cKoCdqTViM98lIRwyzu9rMydONeN8o0HCT5id4nYDhAsXl1vc+2XY6F1pUCgYEA0dxGHBTKD/WzIvTYGYD6Xx224Y84mO6x2Mu16zFoq/NjuIdKi2O+92yrKDCMMCqaY77fXvWD3eI7QYYlbKAOqdLKVipTbhnBccDyNbtYHVg59t4xS+K6HyD+quVkL9n40UkxSZbKZBQhqt+vlQy0FUgONFii1ACZO0A8Sc/bvn4="); |
| | | |
| | | System.out.println(a); |
| | | String p ="{\n" + |
| | | " \"sys_id\": \"6666000182995771\",\n" + |
| | | " \"product_id\": \"KAZX\",\n" + |
| | | " \"sign\": \""+sign+"\",\n" + |
| | | " \"data\": {\n" + |
| | | " \"req_seq_id\": \"20250828150630498989712913\",\n" + |
| | | " \"req_date\": \"20251117\",\n" + |
| | | " \"huifu_id\": \"6666000182995771\",\n" + |
| | | " \"trade_type\": \"A_JSAPI\",\n" + |
| | | " \"combinedpay_data\": \"\",\n" + |
| | | " \"trans_amt\": \"0.01\",\n" + |
| | | " \"goods_desc\": \"支付宝Native\",\n" + |
| | | " \"remark\": \"交易备注\",\n" + |
| | | " \"time_expire\": \"\",\n" + |
| | | " \"delay_acct_flag\": \"N\",\n" + |
| | | " \"fee_flag\": \"\",\n" + |
| | | " \"acct_split_bunch\": \"\",\n" + |
| | | " \"terminal_device_data\": \"{\\\"device_ip\\\":\\\"172.28.52.52\\\",\\\"devs_id\\\":\\\"SPINTP104120617260257\\\"}\",\n" + |
| | | " \"notify_url\": \"\",\n" + |
| | | " \"method_expand\": \"{\\\"buyer_logon_id\\\":\\\"17828262728\\\"}\"\n" + |
| | | " }\n" + |
| | | "}\n"; |
| | | System.out.println(p); |
| | | post.body(p); |
| | | |
| | | HttpResponse execute = post.execute(); |
| | | System.out.println(execute.body()); |
| | | } |
| | | |
| | | |
| | | |
| | | public static String sign(String data, String privateKeyBase64) { |
| | | // Base64 --> Key |
| | | try { |
| | | byte[] bytes = Base64.getDecoder().decode(privateKeyBase64); |
| | | PKCS8EncodedKeySpec keySpec = new PKCS8EncodedKeySpec(bytes); |
| | | KeyFactory keyFactory; |
| | | keyFactory = KeyFactory.getInstance("RSA"); |
| | | PrivateKey privateKey = keyFactory.generatePrivate(keySpec); |
| | | // Sign |
| | | Signature signature = Signature.getInstance("SHA256WithRSA"); |
| | | signature.initSign(privateKey); |
| | | signature.update(data.getBytes("UTF-8")); |
| | | return Base64.getEncoder().encodeToString(signature.sign()); |
| | | } catch (Exception e) { |
| | | return null; |
| | | } |
| | | } |
| | | |
| | | } |