当前位置:   article > 正文

微信开发----微信支付/退款/沙箱的教程_微信支付退款沙箱

微信支付退款沙箱

目录

 

开发前提:

下载demo:

沙箱准备:

退款证书:

微信支付Key

后台操作

代码

操作:


一.开发前提:

下载demo:

这里使用的是官方的demo

沙箱准备:

沙箱可以在模拟环境中进行测试调用,你最好需要这个先调好api,然后再放到真实环境中.

上图的"支付验收指引"里面有微信沙箱使用的简介,你可以看,也可以不看,因为官方demo里有相应的代码。

退款证书:

在一些涉及退款等敏感资源时,微信要求商户在访问时提供证书。怎么获取证书?请登陆微信支付平台,在这里下载:

 下载证书大概长这样:

其中java需要的是apiclient_cert.p12,windows环境下还需要安装,安装请看官方指引

微信支付Key

在上图下载证书的地方往下拉,还有一个设置支付密钥的地方,你需要这个

当然你还需要微信公众号的appid和商户平台的商户id 

二.后台操作

代码

把下载好的demo放到开发工具里你就会发现长这样,下图红圈里的

打开WxPayConfig,你可以看到有这几个要求子类重写的方法。请在前面加上protected或者public

  1. /**
  2. * 获取 App ID
  3. *
  4. * @return App ID
  5. */
  6. abstract String getAppID();
  7. /**
  8. * 获取 Mch ID
  9. *
  10. * @return Mch ID
  11. */
  12. abstract String getMchID();
  13. /**
  14. * 获取 API 密钥
  15. *
  16. * @return API密钥
  17. */
  18. abstract String getKey();
  19. /**
  20. * 获取商户证书内容
  21. *
  22. * @return 商户证书内容
  23. */
  24. abstract InputStream getCertStream();
  25. /**
  26. * 获取WXPayDomain, 用于多域名容灾自动切换
  27. * @return
  28. */
  29. abstract IWXPayDomain getWXPayDomain();

然后我们在外边新建一个WXPayConfigImpl去继承WXPayConfig

  1. public class WXPayConfigImpl extends WXPayConfig {
  2. private String key = "xxxxx";
  3. @Override
  4. protected String getAppID() {
  5. return "xxxxx";
  6. }
  7. @Override
  8. protected String getMchID() {
  9. return "xxxxx";
  10. }
  11. @Override
  12. protected String getKey() {
  13. return key;
  14. }
  15. @Override
  16. protected InputStream getCertStream() {
  17. //return null;
  18. return this.getClass().getResourceAsStream("apiclient_cert.p12");
  19. }
  20. @Override
  21. protected IWXPayDomain getWXPayDomain() {
  22. IWXPayDomain iwxPayDomain = new IWXPayDomain() {
  23. @Override
  24. public void report(String domain, long elapsedTimeMillis, Exception ex) {
  25. }
  26. @Override
  27. public DomainInfo getDomain(WXPayConfig config) {
  28. return new IWXPayDomain.DomainInfo(WXPayConstants.DOMAIN_API, true);
  29. }
  30. };
  31. return iwxPayDomain;
  32. }
  33. @Override
  34. public boolean shouldAutoReport() {
  35. return false;
  36. }
  37. public void setKey(String key) {
  38. this.key = key;
  39. }
  40. public WXPayConfigImpl(String key) {
  41. super();
  42. this.key = key;
  43. }
  44. public WXPayConfigImpl() {
  45. super();
  46. }
  47. /**
  48. * 获取沙箱密钥
  49. *
  50. * @return
  51. * @throws Exception
  52. */
  53. public static String getsignkey() throws Exception {
  54. WXPayConfigImpl config = new WXPayConfigImpl();
  55. WXPay pay = new WXPay(new WXPayConfigImpl());
  56. int readTimeoutMs = 5000;
  57. int connectTimeoutMs = 5000;
  58. Map<String, String> reqData = new HashMap<>();
  59. reqData.put("mch_id", config.getMchID());
  60. reqData.put("nonce_str", WXPayUtil.generateNonceStr());
  61. String urlSuffix = "/sandboxnew/pay/getsignkey";
  62. String string = pay.requestWithoutCert(urlSuffix, pay.fillRequestData(reqData), connectTimeoutMs,
  63. readTimeoutMs);
  64. Map<String, String> map = WXPayUtil.xmlToMap(string);
  65. return map.get("sandbox_signkey");
  66. }
  67. }

对代码解释如下:

1.你需要把appid,商户id,支付key填到相应的地方。

2.如果你需要使用证书,请把证书复制到WXPayConfigImpl旁边,getCertStream方法就是获取证书的方法。

3.getWXPayDomain方法是配置微信支付服务器的域名,微信支付有多个服务器(为了防灾备份),这里配置了最为常用的那个。

4.shouldAutoReport方法是把支付情况(如果出现了Bug?)上报到微信服务器,懒得上报,这里选了false

5.在沙箱环境中,key不再能用,而是需要一个临时的沙箱key。我们需要使用getsignkey去获取沙箱key。

操作:

通过上述配置,代码就非常的方便。我们测试一下

  1. package com;
  2. import java.util.HashMap;
  3. import java.util.Map;
  4. import com.github.wxpay.sdk.WXPay;
  5. public class Test {
  6. /**
  7. * 退款测试
  8. * @param args
  9. * @throws Exception
  10. */
  11. public static void main(String[] args) throws Exception {
  12. //testRefund();//退款
  13. testRefundBySandBox();//沙箱退款
  14. }
  15. /**
  16. * 退款
  17. * @throws Exception
  18. */
  19. private static void testRefund() throws Exception{
  20. Map<String, String> reqData = new HashMap<>();
  21. reqData.put("out_trade_no", "000");
  22. reqData.put("out_refund_no", "000");
  23. reqData.put("total_fee", "100");
  24. reqData.put("refund_fee", "100");
  25. WXPay pay = new WXPay(new WXPayConfigImpl());//关键在此构造
  26. Map<String, String> map = pay.refund(reqData);
  27. System.out.println(map);
  28. }
  29. /**
  30. * 沙箱退款
  31. * @throws Exception
  32. */
  33. private static void testRefundBySandBox() throws Exception{
  34. Map<String, String> reqData = new HashMap<>();
  35. reqData.put("out_trade_no", "000");
  36. reqData.put("out_refund_no", "000");
  37. reqData.put("total_fee", "100");
  38. reqData.put("refund_fee", "100");
  39. WXPay pay = new WXPay(new WXPayConfigImpl(WXPayConfigImpl.getsignkey()), false, true);//关键在此构造
  40. Map<String, String> map = pay.refund(reqData);
  41. System.out.println(map);
  42. }
  43. }

对上代码解释:

1.具体传什么参数,请参考官方文档。

2.沙箱和正式的写法只有WxPay的构造方法的区别。

上述代码是申请退款,统一下单的比葫芦画瓢就行。只是统一下单还需要另外做些工作。

统一下单:https://blog.csdn.net/dmw412724/article/details/82770939

 

 

 

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/小蓝xlanll/article/detail/313637
推荐阅读
相关标签
  

闽ICP备14008679号