微信native-v3版支付对接流程及demo
1.将p12证书转为pem证书,得到商户私钥
openssl pkcs12 -in apiclient_cert.p12 -out apiclient_cert.pem -nodes
密码是:商户id
2.将获取到的apiclient_cert.pem证书,复制出这一块内容,其他的不要
3.下载这个工具包
https://github.com/wechatpay-apiv3/CertificateDownloader
4.在test包中运行
生成证书
5.引入腾讯的sdk
https://github.com/wechatpay-apiv3/wechatpay-apache-httpclient
<dependency>
<groupId>com.github.wechatpay-apiv3</groupId>
<artifactId>wechatpay-apache-httpclient</artifactId>
<version>0.2.2</version>
</dependency>
6.测试示例
import com.fasterxml.jackson.databind.ObjectMapper;
import com.fasterxml.jackson.databind.node.ObjectNode;
import com.wechat.pay.contrib.apache.httpclient.WechatPayHttpClientBuilder;
import com.wechat.pay.contrib.apache.httpclient.util.PemUtil;
import org.apache.http.client.methods.CloseableHttpResponse;
import org.apache.http.client.methods.HttpPost;
import org.apache.http.entity.StringEntity;
import org.apache.http.impl.client.CloseableHttpClient;
import org.apache.http.util.EntityUtils;
import java.io.ByteArrayOutputStream;
import java.io.FileInputStream;
import java.security.cert.X509Certificate;
import java.util.ArrayList;
import java.util.List;
public class test {
public static void main(String[] args) throws Exception {
String apiV3key = "SYKJ20234545weasdq";
// 商户号
String mchId = "150923821451";
// 商户证书序列号
String mchSerialNo = "79D9A85662A93453457720657B19";
// 商户私钥
String mchPrivateKeyFilePath = "D:\可删除\apiclient_cert.pem";
// 微信支付平台证书
String wechatpayCertificateFilePath = "E:\allrun2\微信支付证书工具\wechatpay_38023669B5DBFED58B2B16B3D38CA15DB983E002.pem";
//下载成功后保存证书的路径
String outputFilePath = "E:\allrun2\微信支付证书工具";
//native统一下单
String nativePay = "https://api.mch.weixin.qq.com/v3/pay/transactions/native";
WechatPayHttpClientBuilder builder = WechatPayHttpClientBuilder.create()
.withMerchant(mchId, mchSerialNo, PemUtil.loadPrivateKey(new FileInputStream(mchPrivateKeyFilePath)));
if (wechatpayCertificateFilePath == null) {
//不做验签
builder.withValidator(response -> true);
} else {
List<X509Certificate> certs = new ArrayList<>();
certs.add(PemUtil.loadCertificate(new FileInputStream(wechatpayCertificateFilePath)));
builder.withWechatpay(certs);
}
/*HttpGet httpGet = new HttpGet(CertDownloadPath);
httpGet.addHeader("Accept", "application/json");
try (CloseableHttpClient client = builder.build()) {
CloseableHttpResponse response = client.execute(httpGet);
int statusCode = response.getStatusLine().getStatusCode();
String body = EntityUtils.toString(response.getEntity());
if (statusCode == 200) {
System.out.println("body:" + body);
} else {
System.out.println("download failed,resp code=" + statusCode + ",body=" + body);
throw new IOException("request failed");
}
}*/
HttpPost httpPost = new HttpPost(nativePay);
httpPost.addHeader("Accept", "application/json");
httpPost.addHeader("Content-type","application/json; charset=utf-8");
ObjectMapper objectMapper = new ObjectMapper();
ByteArrayOutputStream bos = new ByteArrayOutputStream();
ObjectNode rootNode = objectMapper.createObjectNode();
rootNode.put("mchid",mchId)
.put("appid", "wxf3152dbae1f27a61")
.put("description", "Ima5677公仔")
.put("notify_url", "http://2j9c780335.zicp.vip/siyu-cloud-pay-biz/pms/wechatPay/callback")
.put("out_trade_no", "515414244");
rootNode.putObject("amount")
.put("total", 1);
objectMapper.writeValue(bos, rootNode);
httpPost.setEntity(new StringEntity(bos.toString("UTF-8")));
try (CloseableHttpClient httpClient = builder.build()) {
CloseableHttpResponse response = httpClient.execute(httpPost);
String bodyAsString = EntityUtils.toString(response.getEntity());
System.out.println(bodyAsString);
}
}
}