赞
踩
目录
这里使用的是官方的demo
沙箱可以在模拟环境中进行测试调用,你最好需要这个先调好api,然后再放到真实环境中.
上图的"支付验收指引"里面有微信沙箱使用的简介,你可以看,也可以不看,因为官方demo里有相应的代码。
在一些涉及退款等敏感资源时,微信要求商户在访问时提供证书。怎么获取证书?请登陆微信支付平台,在这里下载:
下载证书大概长这样:
其中java需要的是apiclient_cert.p12,windows环境下还需要安装,安装请看官方指引。
在上图下载证书的地方往下拉,还有一个设置支付密钥的地方,你需要这个
当然你还需要微信公众号的appid和商户平台的商户id
把下载好的demo放到开发工具里你就会发现长这样,下图红圈里的
打开WxPayConfig,你可以看到有这几个要求子类重写的方法。请在前面加上protected或者public
- /**
- * 获取 App ID
- *
- * @return App ID
- */
- abstract String getAppID();
-
-
- /**
- * 获取 Mch ID
- *
- * @return Mch ID
- */
- abstract String getMchID();
-
-
- /**
- * 获取 API 密钥
- *
- * @return API密钥
- */
- abstract String getKey();
-
-
- /**
- * 获取商户证书内容
- *
- * @return 商户证书内容
- */
- abstract InputStream getCertStream();
- /**
- * 获取WXPayDomain, 用于多域名容灾自动切换
- * @return
- */
- abstract IWXPayDomain getWXPayDomain();
然后我们在外边新建一个WXPayConfigImpl去继承WXPayConfig
- public class WXPayConfigImpl extends WXPayConfig {
- private String key = "xxxxx";
-
- @Override
- protected String getAppID() {
-
- return "xxxxx";
- }
-
- @Override
- protected String getMchID() {
-
- return "xxxxx";
- }
-
- @Override
- protected String getKey() {
-
- return key;
- }
-
- @Override
- protected InputStream getCertStream() {
- //return null;
- return this.getClass().getResourceAsStream("apiclient_cert.p12");
- }
-
- @Override
- protected IWXPayDomain getWXPayDomain() {
- IWXPayDomain iwxPayDomain = new IWXPayDomain() {
- @Override
- public void report(String domain, long elapsedTimeMillis, Exception ex) {
-
- }
- @Override
- public DomainInfo getDomain(WXPayConfig config) {
- return new IWXPayDomain.DomainInfo(WXPayConstants.DOMAIN_API, true);
- }
- };
- return iwxPayDomain;
- }
-
- @Override
- public boolean shouldAutoReport() {
-
- return false;
- }
-
- public void setKey(String key) {
- this.key = key;
- }
-
- public WXPayConfigImpl(String key) {
- super();
- this.key = key;
- }
-
- public WXPayConfigImpl() {
- super();
-
- }
-
- /**
- * 获取沙箱密钥
- *
- * @return
- * @throws Exception
- */
- public static String getsignkey() throws Exception {
- WXPayConfigImpl config = new WXPayConfigImpl();
- WXPay pay = new WXPay(new WXPayConfigImpl());
- int readTimeoutMs = 5000;
- int connectTimeoutMs = 5000;
- Map<String, String> reqData = new HashMap<>();
- reqData.put("mch_id", config.getMchID());
- reqData.put("nonce_str", WXPayUtil.generateNonceStr());
- String urlSuffix = "/sandboxnew/pay/getsignkey";
- String string = pay.requestWithoutCert(urlSuffix, pay.fillRequestData(reqData), connectTimeoutMs,
- readTimeoutMs);
- Map<String, String> map = WXPayUtil.xmlToMap(string);
- return map.get("sandbox_signkey");
- }
-
- }
对代码解释如下:
1.你需要把appid,商户id,支付key填到相应的地方。
2.如果你需要使用证书,请把证书复制到WXPayConfigImpl旁边,getCertStream方法就是获取证书的方法。
3.getWXPayDomain方法是配置微信支付服务器的域名,微信支付有多个服务器(为了防灾备份),这里配置了最为常用的那个。
4.shouldAutoReport方法是把支付情况(如果出现了Bug?)上报到微信服务器,懒得上报,这里选了false
5.在沙箱环境中,key不再能用,而是需要一个临时的沙箱key。我们需要使用getsignkey去获取沙箱key。
通过上述配置,代码就非常的方便。我们测试一下
- package com;
-
- import java.util.HashMap;
- import java.util.Map;
-
- import com.github.wxpay.sdk.WXPay;
-
- public class Test {
- /**
- * 退款测试
- * @param args
- * @throws Exception
- */
- public static void main(String[] args) throws Exception {
- //testRefund();//退款
- testRefundBySandBox();//沙箱退款
- }
- /**
- * 退款
- * @throws Exception
- */
- private static void testRefund() throws Exception{
- Map<String, String> reqData = new HashMap<>();
- reqData.put("out_trade_no", "000");
- reqData.put("out_refund_no", "000");
- reqData.put("total_fee", "100");
- reqData.put("refund_fee", "100");
-
- WXPay pay = new WXPay(new WXPayConfigImpl());//关键在此构造
- Map<String, String> map = pay.refund(reqData);
-
- System.out.println(map);
- }
- /**
- * 沙箱退款
- * @throws Exception
- */
- private static void testRefundBySandBox() throws Exception{
- Map<String, String> reqData = new HashMap<>();
- reqData.put("out_trade_no", "000");
- reqData.put("out_refund_no", "000");
- reqData.put("total_fee", "100");
- reqData.put("refund_fee", "100");
-
- WXPay pay = new WXPay(new WXPayConfigImpl(WXPayConfigImpl.getsignkey()), false, true);//关键在此构造
- Map<String, String> map = pay.refund(reqData);
- System.out.println(map);
- }
-
- }
对上代码解释:
1.具体传什么参数,请参考官方文档。
2.沙箱和正式的写法只有WxPay的构造方法的区别。
上述代码是申请退款,统一下单的比葫芦画瓢就行。只是统一下单还需要另外做些工作。
统一下单:https://blog.csdn.net/dmw412724/article/details/82770939
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。