微信支付退款_微信小程序支付 退款 - CSDN
精华内容
参与话题
  • 微信申请退款API~~开发

    万次阅读 热门讨论 2018-01-27 14:11:04
    近日,在开发“微信申请退款”的功能。之前有过微信开发的经验,但是第一次接触“微信退款“这一块的业务,查询了很多的博客资料以及走了很多的弯路。也发现“微信退款”分享的博客并不多。特地写了该博客,希望对...

    近日,在开发“微信申请退款”的功能。之前有过微信开发的经验,但是第一次接触“微信退款“这一块的业务,查询了很多的博客资料以及走了很多的弯路。也发现“微信退款”分享的博客并不多。特地写了该博客,希望对你们有帮助。个人浅薄的见解

    代码下载地址如下:
    链接:https://pan.baidu.com/s/1h6_ZSz5RbFARlY9yxkvj5w
    提取码:weft
    有任何关于微信开发的问题可以相互交流, 推荐QQ:2172931891 , 另外有微商城、微分销、微信小游戏等系统源码,有需要可以联系免费提供。



    一、微信退款Api


    https://pay.weixin.qq.com/wiki/doc/api/jsapi.php?chapter=9_4

    二、开发准备
    (1)证书的准备:java开发需要用到:apiclient_cert.p12证书的,在微信公众号上下载–注意PKCS12证书 是从微信商户平台-》账户设置-》 API安全 中下载的 。
    这里写图片描述
    【何时用到证书?】与支付不一样,企业支付功能在发送post请求的时候,需要加载自己的一个证书之后,带着证书去请求退款才可以。这里使用到证书–很多人不知道证书在哪里使用
    (2)了解好数字签名 — 简单来解释,就是对自己要发送的数据进行加密处理、换句话说假如说你要传递A/B/C,就对这三者进行加密。初开发者的误区:不知道该加密什么数据、观看网上的博客胡乱进行签名,导致签名错误
    【温馨提示:】数字签名是一般开发人员容易遇到的错误,记住“你没遇到数字签名错误,都不好意思说自己做过微信退款支付订单查询等功能”。
    耐心解决就行
    (3)熟悉 从xml–》map,以及map—》xml。因为微信只接受xml数据,java写一个xml不简单,但是写map集合非常简单。而且返回的数据是xml格式。需要转化成开发熟知的map集合
    不懂的可以看以下这篇博客
    http://blog.csdn.net/xiaozhegaa/article/details/79127283

    三、退款API截图解释
    ~~ 接口说明 + 是否需要证书
    这里写图片描述
    数字签名说明 – 记住一句话:对要传递的数据进行加密,你要传递什么就要签名什么
    第一次开发遇到的坑就是:不了解数字签名、花费了自己很长的时间,特地出来强调一下
    证书说明
    这里写图片描述

    四、开发步骤如下
    1.拼凑所需要传递的参数 map集合
    2.根据要传递的参数生成自己的签名
    3.把签名放到map集合中【因为签名也要传递过去】
    4.将当前的map结合转化成xml格式
    5.发送请求到微信退款Api。发送请求是一个方法来的
    6.解析返回的xml数据===》map集合
    7.根据map中的result_code/return_code来判断是否成功与失败

    不得不再啰嗦一下。下面设计到签名、mapToXml转化、xmlToMap转化、发送请求到API。这些方法都可以在下面网址看到。这里我Xml转化成Map。我是习惯用一个Bean接收,也有范例的代码,大家模仿能力要强一点。这次贴出来给大家看看吧
    http://blog.csdn.net/xiaozhegaa/article/details/79127283

    /** 
    	* 解析退款申请 
    	* 解析的时候自动去掉CDMA 
    	* @param xml 
    	*/ 
    	@SuppressWarnings("unchecked") 
    	public static RefundResult getUnifiedorderResult(String xml){ 
    				RefundResult unifieorderResult = new RefundResult(); 
    			try { 
    					StringReader read = new StringReader(xml); 
    					// 创建新的输入源SAX 解析器将使用 InputSource 对象来确定如何读取 XML 输入 
    					InputSource source = new InputSource(read); 
    					// 创建一个新的SAXBuilder 
    					SAXBuilder sb = new SAXBuilder(); 
    					// 通过输入源构造一个Document 
    					Document doc; 
    					doc = (Document) sb.build(source); 
    				
    					Element root = doc.getRootElement();// 指向根节点 
    					List<Element> list = root.getChildren(); 
    				
    					if(list!=null&&list.size()>0){ 
    					for (Element element : list) { 
    						System.out.println("key是:"+element.getName()+",值是:"+element.getText()); 
    						if("return_code".equals(element.getName())){ 
    								unifieorderResult.setResult_code(element.getText()); 
    							} 
    					
    						if("return_msg".equals(element.getName())){ 
    							unifieorderResult.setReturn_msg(element.getText()); 
    							} 
    					
    						if("result_code".equals(element.getName())){ 
    							unifieorderResult.setResult_code(element.getText()); 
    							} 
    						
    						
    						if("out_refund_no".equals(element.getName())){ 
    							unifieorderResult.setOut_refund_no(element.getText()); 
    							} 
    						
    						if("refund_id".equals(element.getName())){ 
    							unifieorderResult.setRefund_id(element.getText()); 
    							} 
    						
    						if("refund_fee".equals(element.getName())){ 
    							unifieorderResult.setRefund_fee(element.getText()); 
    							} 
    						
    						if("coupon_refund_fee".equals(element.getName())){ 
    							unifieorderResult.setCoupon_refund_fee(element.getText()); 
    							} 
    						
    						if("total_fee".equals(element.getName())){ 
    							unifieorderResult.setTotal_fee(element.getText()); 
    							} 
    						
    						if("cash_fee".equals(element.getName())){ 
    							unifieorderResult.setCash_fee(element.getText()); 
    							} 
    						if("err_code_des".equals(element.getName())){ 
    							unifieorderResult.setErr_code_des(element.getText()); 
    							} 
    						}
    					}
    				
    
    			} catch (JDOMException e) { 
    			e.printStackTrace(); 
    			} catch (IOException e) { 
    			e.printStackTrace(); 
    			}catch (Exception e) { 
    			e.printStackTrace(); 
    			} 
    				
    			return unifieorderResult; 
    		} 
    
    
    @Test
    	public void test2(){
    		SortedMap<Object, Object> packageParams = new TreeMap<Object, Object>(); 
    		
    		packageParams.put("appid", wxconfig.AppID);
    		packageParams.put("mch_id", wxconfig.mch_id);
    		
    		String s = UUID.randomUUID().toString().replace("-", "");
    		packageParams.put("nonce_str",s);
    		
    		String s1 = UUID.randomUUID().toString().replace("-", "");
    		packageParams.put("out_refund_no",s1);
    		packageParams.put("out_trade_no","ozb5fjjxbwag1akdy0vm108makqhsdmx");
    	
    		packageParams.put("refund_fee","100");
    		packageParams.put("total_fee","100");
    		
    		packageParams.put("op_user_id",wxconfig.mch_id);
    		
    		String sign  = WeixinPayBack.createSign("utf-8",packageParams);
    		
    		packageParams.put("sign", sign);
    		
    		String reuqestXml = WXPayUtil.getRequestXml(packageParams);
    		 
    		System.out.println("-----------------"); 
    		System.out.println(reuqestXml);
    		System.out.println("-----------------"); 
    		//发送请求到后台了
    		String wxUrl = WeixinPayBack.getRefundURL; 
    		try {
    			String weixinPost = ClientCustomSSL.doRefund(wxUrl, reuqestXml).toString();
    			System.out.println(weixinPost);
    			
    			RefundResult refundResult = WeixinPayBack.getUnifiedorderResult(weixinPost);  
    			    
    		    String result =null;
    		    if("SUCCESS".equalsIgnoreCase(refundResult.getResult_code())){ 
    		    	result = "200"; 
    		    	System.out.println("==========处理退款成功=========="); 
    	    	}else{ 
    	    		result = refundResult.getReturn_msg(); 
    	    	} 
    		    
    		    System.out.println(result);
    		} catch (Exception e) {
    			// TODO Auto-generated catch block
    			e.printStackTrace();
    		}  
    		
    		
    		
    	}
    

    这里写图片描述
    五、结果演示
    这里写图片描述
    自此,我们就学会了“微信申请退款”的开发,希望对你们有帮助
    具体的、在调用改方法自己加上自己的业务逻辑就行了。希望对大家有帮助

    //TODO 9.0 操作支付表,把当前的支付的状态变成 退款状态   state 1 ---> 2
    //TODO 10 操作预约表,可以把当前的预约状态取消  已支付--->退款
    //TODO 11 操作用户表,如果是充值退款的话,把用户的现金 - 当前退款的money
    //TODO 12其他等等的操作,生成记录单号之类的
    
    展开全文
  • 微信支付之原路退款

    万次阅读 2018-05-10 17:06:31
    1.场景还原 最近项目要求上线微信支付原路退款功能,今天笔者就微信支付原路退款的流程梳理下,方便有需要的伙伴借阅2.准备工作①获取微信支付的相关配置WECHATPAY_PARTNER = "150xxxxxxx"; //商户号 ...

    1.场景还原

       最近项目要求上线微信支付原路退款功能,今天笔者就微信支付原路退款的流程梳理下,方便有需要的伙伴借阅

    2.准备工作

    ①获取微信支付的相关配置

     

    WECHATPAY_PARTNER = "150xxxxxxx"; //商户号
    WECHATPAY_PARTNERKEY = "Yunjunxxxxxxxxxxxxxyyyyyyyy"; //商户秘钥

    ②获取微信支付API证书

    微信支付后台管理--》API安全--》下载证书

    ③阅读微信官方申请退款文档,确保请求参数完整

    ④将证书.p12文件放置工程的resources下

     

    InputStream instream = PropertiesUtil.class.getResourceAsStream("/yiwei/apiclient_cert.p12")

    3.实现方案

    代码如下:

     

    @Override
    public String doRefoundByWX(Map<String,Object> map) throws Exception {
        if (ObjectUtil.isNull(map.get("refund_money"),map.get("transaction_id"),map.get("channel"),map.get("sum_money"))) {
            throw new RequestException();
        }
    
        String refund_money = map.get("refund_money").toString(); //退款金额
        String out_trade_no = map.get("transaction_id").toString();//微信订单号
        String channel = map.get("channel").toString();
        String sumMoney = map.get("sum_money").toString(); //订单总价
    
        String result = "";
        //根据app渠道获取微信的appid及appSecret
        WxpayUtil.loadWxAppIdAndSecret(Integer.valueOf(channel));
        String mch_id = WxpayUtil.WECHATPAY_PARTNER;
        String appid = WxpayUtil.WECHATPAY_APPID;
        String partnerkey = WxpayUtil.WECHATPAY_PARTNERKEY;
        String nonce_str = WeiXinUtil.CreateNoncestr();//随机字符串
        String out_refund_no = WeiXinUtil.generatePayNO();//商户退款单号
        Double total_fee = 0d;
        try {
            total_fee = StringUtil.getDouble(sumMoney);
        } catch (NumberFormatException e) {
            e.printStackTrace();
        } catch (Exception e) {
            e.printStackTrace();
        }
        //总金额以分为单位
        long totalAmount = new BigDecimal(total_fee * 100d).longValue();
        Double refund_fee = Double.parseDouble(refund_money);
        //退款金额以分为单位
        long Amount = new BigDecimal(refund_fee * 100d).longValue();
       
    
        //签名算法
        SortedMap<Object, Object> SortedMap = new TreeMap<Object, Object>();
        SortedMap.put("appid", appid);
        SortedMap.put("mch_id", mch_id);
        SortedMap.put("nonce_str", nonce_str);
        SortedMap.put("out_trade_no", out_trade_no);
        SortedMap.put("out_refund_no", out_refund_no);
        SortedMap.put("total_fee", String.valueOf(totalAmount));
        SortedMap.put("refund_fee", String.valueOf(Amount));
    
    
        String sign = WeiXinUtil.createSign("UTF-8",partnerkey,SortedMap);
        //获取最终待发送的数据
        String requestXml = "<xml>" +
                "<appid>" + appid + "</appid>" +
                "<mch_id>" + mch_id + "</mch_id>" +
                "<nonce_str>" + nonce_str + "</nonce_str>" +
                "<out_trade_no>" + out_trade_no + "</out_trade_no>" +
                "<out_refund_no>" + out_refund_no + "</out_refund_no>" +
                "<total_fee>" + String.valueOf(totalAmount) + "</total_fee>" +
                "<refund_fee>" + String.valueOf(Amount) + "</refund_fee>" +
                "<sign>" + sign + "</sign>" +
                "</xml>";
        //建立连接并发送数据
        HashMap<String, Object> resultMap = null;
        try {
            result = WeiXinUtil.WeixinSendPost(requestXml,mch_id,channel);
            //解析返回的xml
            resultMap = new HashMap<String, Object>(XMLParse.parseXmlToList2(result));
        }catch (Exception e){
            e.printStackTrace();
        }
    
        //退款返回标志码
        String return_code = resultMap.get("return_code").toString();
        String result_code = resultMap.get("result_code").toString();
        String msg = "";
        if(return_code.equals("SUCCESS") && result_code.equals("SUCCESS")){
           String userId = payorderMapper.getUserIdByOutTradeOrder(out_trade_no);
            //减少用户余额
            Integer updateAmount = this.accountMapper.subtractAmount(userId, refund_money);
            // 生成我的钱包流水
            Double remainAmount = this.accountMapper.findAmountByUserId(userId);
            AccountFlow flow = AccountFlow.newBuilder().setUserId(userId).setOrderCode(out_trade_no).setBody("微信原路退款扣除金额")
                    .setIsInflow("0").setTotal_amount(refund_money).setRemainAmount(remainAmount.toString()).build();
            Integer insertAccountFlow = this.accountFlowMapper.insert(flow.toMap());
    
            msg = "微信原路返款成功!";
            if(updateAmount != 1 || insertAccountFlow != 1) {
                TransactionAspectSupport.currentTransactionStatus().setRollbackOnly();
                return JsonUtil.toJson(new ResultBean(true, "微信原路返款失败", null));
            }
        }else if(return_code.equals("SUCCESS") && result_code.equals("FAIL")){
            msg = "微信原路返款失败!";
        }else{
            msg = "微信原路返款未知错误!";
        }
        return JsonUtil.toJson(new ResultBean(true, msg, null));
    
    }

    签名方法:

     

    /**
     * @Description:sign签名
     * @param characterEncoding
     *            编码格式
     * @param parameters
     * @param  secretKey
     *            请求参数
     * @return
     */
    public static String createSign(String characterEncoding,String secretKey, SortedMap<Object, Object> parameters) {
       StringBuffer sb = new StringBuffer();
       Set<Map.Entry<Object, Object>> es = parameters.entrySet();
       Iterator<Map.Entry<Object, Object>> it = es.iterator();
       while (it.hasNext()) {
          Map.Entry<Object, Object> entry = (Map.Entry<Object, Object>) it.next();
          String k = (String) entry.getKey();
          Object v = entry.getValue();
          if (null != v && !"".equals(v) && !"sign".equals(k) && !"key".equals(k)) {
             sb.append(k + "=" + v + "&");
          }
       }
       sb.append("key=" + secretKey);
       String sign = MD5Utils4WX.MD5Encode(sb.toString(), characterEncoding).toUpperCase();
       parameters.put("sign", sign);
       return sign;
    }

    这里的secretKey指的是微信商户秘钥

    执行退款逻辑

     

    public static String WeixinSendPost(Object xmlObj,String mch_id,String channel) throws IOException, KeyStoreException, UnrecoverableKeyException, NoSuchAlgorithmException, KeyManagementException {
    
       String result = "";
       InputStream instream = PropertiesUtil.class.getResourceAsStream("/yiwei/apiclient_cert.p12");
       KeyStore keyStore = KeyStore.getInstance("PKCS12");
       try {
          keyStore.load(instream, mch_id.toCharArray());
       } catch (CertificateException e) {
          e.printStackTrace();
       } catch (NoSuchAlgorithmException e) {
          e.printStackTrace();
       } finally {
          instream.close();
       }
    
       SSLContext sslcontext = SSLContexts.custom().loadKeyMaterial(keyStore, mch_id.toCharArray()).build();
    
       SSLConnectionSocketFactory sslsf = new SSLConnectionSocketFactory(sslcontext, new String[] { "TLSv1" }, null, SSLConnectionSocketFactory.BROWSER_COMPATIBLE_HOSTNAME_VERIFIER);
       CloseableHttpClient httpclient = HttpClients.custom().setSSLSocketFactory(sslsf).build();
       try {
    
          HttpPost httpPost = new HttpPost("https://api.mch.weixin.qq.com/secapi/pay/refund");
          @SuppressWarnings("deprecation")
          HttpEntity xmlData = new StringEntity((String) xmlObj, "text/xml", "iso-8859-1");
          httpPost.setEntity(xmlData);
    
          System.out.println("executing request" + httpPost.getRequestLine());
    
          CloseableHttpResponse response = httpclient.execute(httpPost);
          try {
             HttpEntity entity = response.getEntity();
             result = EntityUtils.toString(entity, "UTF-8");
             System.out.println(response.getStatusLine());
             EntityUtils.consume(entity);
          } finally {
             response.close();
          }
       } finally {
          httpclient.close();
       }
       //去除空格
       return result.replaceAll(" ", "");
    }

    执行完之后再进行是否成功判断

     

    result = WeiXinUtil.WeixinSendPost(requestXml,mch_id,channel);
    //解析返回的xml
    resultMap = new HashMap<String, Object>(XMLParse.parseXmlToList2(result));

    将xml字符串解析map方法

     

    public static Map parseXmlToList2(String xml) {
       Map retMap = new HashMap();
       try {
          StringReader read = new StringReader(xml);
          // 创建新的输入源SAX 解析器将使用 InputSource 对象来确定如何读取 XML 输入
          InputSource source = new InputSource(read);
          // 创建一个新的SAXBuilder
          SAXBuilder sb = new SAXBuilder();
          // 通过输入源构造一个Document
          Document doc =  sb.build(source);
          Element root = (Element) doc.getRootElement();// 指向根节点
          List<Element> es = root.getChildren();
          if (es != null && es.size() != 0) {
             for (Element element : es) {
                retMap.put(element.getName(), element.getValue());
             }
          }
       } catch (Exception e) {
          e.printStackTrace();
       }
       return retMap;
    }  

    创作不易,莫要白嫖,您的关注及点赞是对于我创作的最大动力与源泉。

     

    展开全文
  • 就算商户系统没有开通微信退款结果通知,微信也会自己发送消息告诉用户退款流程和结果。如果是立马到账的,会直接发送退款结果通知;非立马到账的,会先发一条“退款发起通知”,到账之后再发一条到账通知。 如果...

    就算商户系统没有开通微信退款结果通知,微信也会自己发送消息告诉用户退款流程和结果。如果是立马到账的,会直接发送退款结果通知;非立马到账的,会先发一条“退款发起通知”,到账之后再发一条到账通知。
    在这里插入图片描述

    如果商户系统(在本文中指公众号)开通微信退款结果通知,然后根据退款结果推送消息告知用户的,那么用户就会收到两份退款通知,一份来自公众号,一份来自微信,如下图:
    在这里插入图片描述
    在这里插入图片描述

    展开全文
  • 微信支付Key 后台操作 代码 操作: 一.开发前提: 下载demo: 这里使用的是官方的demo 沙箱准备: 沙箱可以在模拟环境中进行测试调用,你最好需要这个先调好api,然后再放到真实环境中. 上图的"支付验收指引...

    目录

     

    开发前提:

    下载demo:

    沙箱准备:

    退款证书:

    微信支付Key

    后台操作

    代码

    操作:


    一.开发前提:

    下载demo:

    这里使用的是官方的demo

    沙箱准备:

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

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

    退款证书:

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

     下载证书大概长这样:

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

    微信支付Key

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

    当然你还需要微信公众号的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

     

     

     

    展开全文
  • 微信支付-申请退款

    千次阅读 2019-01-15 10:04:10
    方式一:调用微信支付的SDK里的refund 第一步:依赖 &lt;!--微信支付--&gt; &lt;dependency&gt; &lt;groupId&gt;com.github.wxpay&lt;/groupId&gt; &lt;artifactId&...
  • 微信支付-退款(v3版微信支付)

    万次阅读 热门讨论 2014-12-15 18:59:05
    做完微信支付,如果遇到顾客需要退款的情况,我们就要调用微信的退款接口进行对款操作。下面大致介绍下微信支付退款的流程、主要代码以及一些我测出的bug解决方法。 先说下我们需要哪些jar包以及微信给我们的证书...
  • 这一篇博客跟着我上一篇博客的思路和流程继续,如果想看上一篇博客的童鞋,可以点击微信支付----统一下单接口对接进行阅读,本篇博客将介绍申请退款退款通知两个接口的开发。 一,申请退款接口  注意点: ​...
  • JAVA微信支付退款接口demo 应用场景 当交易发生之后一段时间内,由于买家或者卖家的原因需要退款时,卖家可以通过退款接口将支付款退还给买家,微信支付将在收到退款请求并且验证成功之后,按照退款规则将支付款按...
  • 微信支付退款

    2019-06-15 14:27:07
    作者:Jcode95 来源:CSDN 原文:https://blog.csdn.net/qq_34827263/article/details/82048943 版权声明:本文为博主原创文章,转载请附上博文链接! maven文件 org.springframework spring-aop ... ...
  • 微信支付退款php代码参考

    千次阅读 2018-11-04 23:10:13
    微信支付退款 微信支付退款文档https://pay.weixin.qq.com/wiki/doc/api/app/app.php?chapter=9_4&amp;index=6 代码参考 //微信账号信息 $config =&gt;array(  "app_id"=&gt;"", ...
  • 微信支付退款通知解密-java-亲测可用版 (1)对加密串A做base64解码,得到加密串B (2)对商户key做md5,得到32位小写key* (3)用key*对加密串B做AES-256-ECB解密 包含需要替换的jar包,1.6、1.7、1.8
  • 微信支付退款通知解密 aes256 ecb pk7
  • 对接微信支付退款证书之坑

    万次阅读 2018-10-25 11:07:16
    项目需要直接对接微信支付,实现小程序支付和退款功能,支付不需要证书,但是退款的话需要证书支持 语言:php 开发环境win 测试环境centos 坑点1:路径问题 网上查到比较多的答案是在Linux系统下采用虚拟路径,...
  • 微信支付退款接口错误码对照表,对照调试中出现的错误代码,查看具体原因
  • 微信支付退款证书使用

    万次阅读 2018-04-09 16:58:02
    @Value("${wx.refund.cert.path}"... * 退款、撤销 订单支付使用的payProxy * @return */ private WeixinPayProxy createSSLPayProxy() { ManagerConfigPublicInfo config = manage...
  • 案例java代码: 链接:https://pan.baidu.com/s/14IwWwSkfci5pUKOTpjIB7w 提取码:q5ia 复制这段内容后打开百度网盘手机App,操作更方便哦
  • 支付接口不需要。点击证书使用。 按照不步骤:下载证书。 (2)使用API证书 ◆ apiclient_cert.p12是商户证书文件,除PHP外的开发均使用此证书文件。 ◆ 商户如果使用.NET环境开发,请确认Framework版本大于2.0...
  • 微信支付退款回调

    千次阅读 2018-11-22 11:52:43
     这个步骤做过微信支付的都会就不说了 2、对加密串 req_info 做base64解码,得到加密串B (类型为byte[])  byte B[] = Base64.decode(reqInfo); 3、对商户key做md5,得到32位小写key* ( key设置路径:微信...
  • (1)对加密串A做base64解码,得到加密串B (2)对商户key做md5,得到32位小写key* (3)用key*对加密串B做AES-256-ECB解密 包含需要替换的jar包,1.6、1.7、1.8
  • 微信支付退款成功回调结果的解密

    千次阅读 2019-06-19 10:13:21
    微信退款成功后,会向用户指定的地址发送一个请求,参数是微信退款的状态,成功,失败都有回复,但是数据是加密的 网上的很多说解密的,但是那些解密的函数已数被php弃用了 //可逆加密 function encrypt($data, $...
1 2 3 4 5 ... 20
收藏数 5,918
精华内容 2,367
关键字:

微信支付退款