| @@ -1,16 +1,27 @@ | |||||
| package com.github.binarywang.wxpay.v3.auth; | package com.github.binarywang.wxpay.v3.auth; | ||||
| import com.github.binarywang.wxpay.exception.WxPayException; | |||||
| import com.github.binarywang.wxpay.v3.Credentials; | import com.github.binarywang.wxpay.v3.Credentials; | ||||
| import com.github.binarywang.wxpay.v3.WechatPayUploadHttpPost; | import com.github.binarywang.wxpay.v3.WechatPayUploadHttpPost; | ||||
| import com.github.binarywang.wxpay.v3.util.PemUtils; | |||||
| import jodd.util.ResourcesUtil; | |||||
| import lombok.extern.slf4j.Slf4j; | import lombok.extern.slf4j.Slf4j; | ||||
| import org.apache.commons.lang3.RegExUtils; | |||||
| import org.apache.http.HttpEntityEnclosingRequest; | import org.apache.http.HttpEntityEnclosingRequest; | ||||
| import org.apache.http.client.methods.HttpRequestWrapper; | import org.apache.http.client.methods.HttpRequestWrapper; | ||||
| import org.apache.http.util.EntityUtils; | import org.apache.http.util.EntityUtils; | ||||
| import java.io.File; | |||||
| import java.io.FileInputStream; | |||||
| import java.io.IOException; | import java.io.IOException; | ||||
| import java.io.InputStream; | |||||
| import java.net.URI; | import java.net.URI; | ||||
| import java.net.URL; | |||||
| import java.nio.charset.StandardCharsets; | import java.nio.charset.StandardCharsets; | ||||
| import java.security.PrivateKey; | |||||
| import java.security.SecureRandom; | import java.security.SecureRandom; | ||||
| @Slf4j | @Slf4j | ||||
| @@ -80,7 +91,7 @@ public class WxPayCredentials implements Credentials { | |||||
| if (request.getOriginal() instanceof WechatPayUploadHttpPost) { | if (request.getOriginal() instanceof WechatPayUploadHttpPost) { | ||||
| body = ((WechatPayUploadHttpPost) request.getOriginal()).getMeta(); | body = ((WechatPayUploadHttpPost) request.getOriginal()).getMeta(); | ||||
| } else if (request instanceof HttpEntityEnclosingRequest) { | } else if (request instanceof HttpEntityEnclosingRequest) { | ||||
| body = EntityUtils.toString(((HttpEntityEnclosingRequest) request).getEntity()); | |||||
| body = EntityUtils.toString(((HttpEntityEnclosingRequest) request).getEntity(),"UTF-8"); | |||||
| } | } | ||||
| return request.getRequestLine().getMethod() + "\n" | return request.getRequestLine().getMethod() + "\n" | ||||
| @@ -89,5 +100,96 @@ public class WxPayCredentials implements Credentials { | |||||
| + nonce + "\n" | + nonce + "\n" | ||||
| + body + "\n"; | + body + "\n"; | ||||
| } | } | ||||
| public static void main(String[] args) { | |||||
| try { | |||||
| String nonceStr = "1659525492505"; | |||||
| long timestamp = 1659525493; | |||||
| String message = buildMessagettt(nonceStr, timestamp); | |||||
| InputStream keyInputStream = loadConfigInputStream("C:\\ttttttt\\1036\\apiclient_key.pem"); | |||||
| PrivateKey merchantPrivateKey = PemUtils.loadPrivateKey(keyInputStream); | |||||
| Signer signer = new PrivateKeySigner("562723E501CBEACA6B6835666168EBEB777360A4", merchantPrivateKey); | |||||
| Signer.SignatureResult signature = signer.sign(message.getBytes(StandardCharsets.UTF_8)); | |||||
| String mchid = "1623869862"; | |||||
| String token = "mchid=\"" + mchid + "\"," | |||||
| + "nonce_str=\"" + nonceStr + "\"," | |||||
| + "timestamp=\"" + timestamp + "\"," | |||||
| + "serial_no=\"" + signature.certificateSerialNumber + "\"," | |||||
| + "signature=\"" + signature.sign + "\""; | |||||
| System.out.println(token); | |||||
| } catch (IOException e) { | |||||
| // TODO Auto-generated catch block | |||||
| e.printStackTrace(); | |||||
| } catch (WxPayException e) { | |||||
| // TODO Auto-generated catch block | |||||
| e.printStackTrace(); | |||||
| } | |||||
| } | |||||
| private static String buildMessagettt(String nonce, long timestamp) | |||||
| throws IOException { | |||||
| String body = "{\"appid\":\"wx649b3be73c1afe47\",\"batch_name\":\"百丽提现\",\"batch_remark\":\"提现编号:714465978943332352\",\"out_batch_no\":\"714465978943332352\",\"total_amount\":100,\"total_num\":1,\"transfer_detail_list\":[{\"openid\":\"opvcM5IEkl0U5pNiHcN49Ens40jU\",\"out_detail_no\":\"8c2145ceb1bf427ea147a88b42af9e9e\",\"transfer_amount\":100,\"transfer_remark\":\"百丽提现\"}]}"; | |||||
| return "POST" + "\n" | |||||
| + "/v3/transfer/batches" + "\n" | |||||
| + timestamp + "\n" | |||||
| + nonce + "\n" | |||||
| + body + "\n"; | |||||
| } | |||||
| private static final String PROBLEM_MSG = "证书文件【%s】有问题,请核实!"; | |||||
| private static final String NOT_FOUND_MSG = "证书文件【%s】不存在,请核实!"; | |||||
| /** | |||||
| * 从配置路径 加载配置 信息(支持 classpath、本地路径、网络url) | |||||
| * @param configPath 配置路径 | |||||
| * @return | |||||
| * @throws WxPayException | |||||
| */ | |||||
| private static InputStream loadConfigInputStream(String configPath) throws WxPayException { | |||||
| InputStream inputStream; | |||||
| final String prefix = "classpath:"; | |||||
| String fileHasProblemMsg = String.format(PROBLEM_MSG, configPath); | |||||
| String fileNotFoundMsg = String.format(NOT_FOUND_MSG, configPath); | |||||
| if (configPath.startsWith(prefix)) { | |||||
| String path = RegExUtils.removeFirst(configPath, prefix); | |||||
| if (!path.startsWith("/")) { | |||||
| path = "/" + path; | |||||
| } | |||||
| try { | |||||
| inputStream = ResourcesUtil.getResourceAsStream(path); | |||||
| if (inputStream == null) { | |||||
| throw new WxPayException(fileNotFoundMsg); | |||||
| } | |||||
| } catch (Exception e) { | |||||
| throw new WxPayException(fileNotFoundMsg, e); | |||||
| } | |||||
| } else if (configPath.startsWith("http://") || configPath.startsWith("https://")) { | |||||
| try { | |||||
| inputStream = new URL(configPath).openStream(); | |||||
| if (inputStream == null) { | |||||
| throw new WxPayException(fileNotFoundMsg); | |||||
| } | |||||
| } catch (IOException e) { | |||||
| throw new WxPayException(fileNotFoundMsg, e); | |||||
| } | |||||
| } else { | |||||
| try { | |||||
| File file = new File(configPath); | |||||
| if (!file.exists()) { | |||||
| throw new WxPayException(fileNotFoundMsg); | |||||
| } | |||||
| inputStream = new FileInputStream(file); | |||||
| } catch (IOException e) { | |||||
| throw new WxPayException(fileHasProblemMsg, e); | |||||
| } | |||||
| } | |||||
| return inputStream; | |||||
| } | |||||
| } | } | ||||