微信退款操作总结

微信退款操作总结

应用场景:在订单系统中,用户创建订单,发起支付;收到微信支付成功的回调,触发订单支付完成的处理。当用户发起退款申请时,通过业务控制权限审批,对于审批通过的退款申请,调用微信代理服务进行退款操作。
  官方文档:https://pay.weixin.qq.com/wiki/doc/api/wxa/wxa_api.php?chapter=9_4。

要点:请求需要双向证书。
相比支付(预支付)退款操作需要双向证书,即客户端也需要提供证书(openssl)。

实现

  1. 加载API证书文件
private SSLContext getSSLContext() throws Exception {
	
	File file1 = new File(this.getClass().getClassLoader().getResource(WxConfig.Merch_Cert_Filename).getFile());
	if(!file1.exists()) { //检测证书文件是否存在
		
		this.logger.D(Module_Tag, "加载API证书文件异常!");
		return (null);
	}
	
	//商户双向证书(PKCS12证书)
	KeyStore keyStore = KeyStore.getInstance("PKCS12");
	//加载文件
	FileInputStream fis1 = new FileInputStream(file1);
	try {
		//加载证书
		keyStore.load(fis1,  WxConfig.Merch_ID.toCharArray() );
	} finally { //善后
		fis1.close();
	}
	
	//加载证书
	return SSLContextBuilder.create().loadKeyMaterial(keyStore, WxConfig.Merch_ID.toCharArray()).build();
}
  1. 发起https请求并获得反馈报文
/**
 * 带证书推送XML内容
 * @param url						请求url
 * @param xmlText					提交xml报文
 * @return							返回报文
 * @throws Exception				异常信息
 * @see 使用证书推送XML内容https://pay.weixin.qq.com/wiki/doc/api/wxa/wxa_api.php?chapter=4_3
 */
public String doPost_WithsCert(String url, String xmlText) throws Exception {
	
	SSLContext ctx = getSSLContext();
	if(null == ctx) {
		return (null);
	}

	//指定TLSv1协议
	SSLConnectionSocketFactory sslsf =  new SSLConnectionSocketFactory(
			ctx,
			new String[] { "TLSv1" },
			null,
			NoopHostnameVerifier.INSTANCE);
	CloseableHttpClient httpclient = HttpClients.custom()
			.setSSLSocketFactory(sslsf)
			.build();
	
	try {
		HttpPost post = new HttpPost(url);
		//
		ByteArrayEntity contents = new ByteArrayEntity(xmlText.getBytes(FsSpec.Charset_Default));
			contents.setContentType("application/x-www-form-urlencoded");
		post.setEntity(contents);
		//执行POST方法
		HttpResponse response = httpclient.execute(post);
		//返回状态
		int statusCode = response.getStatusLine().getStatusCode();
		StringBuffer sb = new StringBuffer();
		if (statusCode == HttpStatus.SC_OK) {
			HttpEntity entity = response.getEntity();
			if (entity != null) {
				//指定内容的读取编码为UTF-8(服务方必须为UTF-8编码)
				InputStreamReader isr = new InputStreamReader(entity.getContent(), FsSpec.Charset_Default);
				BufferedReader br = new BufferedReader(isr);
				String line=null;
				while ((line = br.readLine()) != null) { //读取服务端反馈
					sb.append(line);
				}
			}
			post.abort();
		} else {
			post.abort();
			return (null);
		}
		return (sb.toString() );
	} catch( ClientProtocolException e) {
		e.printStackTrace();
	} catch (IOException e) {
		e.printStackTrace();
	}
	return (null);		
}

说明:适用HttpClient 4.5.x版本库。
   构造SSLConnectionSocketFactory的方法使用的是非废除的方法,其原型为:

/**
 * @since 4.4
 */
public SSLConnectionSocketFactory(
		final SSLContext sslContext,
		final String[] supportedProtocols,
		final String[] supportedCipherSuites,
		final HostnameVerifier hostnameVerifier);

其中hostnameVerifier用的是NoopHostnameVerifier.INSTANCE
其描述为:

/**
 * The NO_OP HostnameVerifier essentially turns hostname verification
 * off. This implementation is a no-op, and never throws the SSLException.
 *
 * @since 4.4
 */

表明其是一个简单的、实际上不进行验证的验证器。
已废除的构造SSLConnectionSocketFactory的方法原型为:

/**
 * @deprecated (4.4) Use {@link #SSLConnectionSocketFactory(javax.net.ssl.SSLContext,
 *   String[], String[], javax.net.ssl.HostnameVerifier)}
 */
@Deprecated
public SSLConnectionSocketFactory(
		final SSLContext sslContext,
		final String[] supportedProtocols,
		final String[] supportedCipherSuites,
		final X509HostnameVerifier hostnameVerifier);
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
Java微信退款V3是指使用Java语言开发的微信支付接口版本V3中的退款功能。微信支付是一种在线支付平台,用户可以通过微信支付完成各种消费,包括购买商品、预定服务等。在某些情况下,用户可能需要退款,例如购买商品后发现有质量问题或者服务未提供等原因。 Java微信退款V3提供了一种方便快捷的方式来实现退款操作。具体流程如下: 1. 创建退款请求:通过Java代码构建一个退款请求对象,包括订单号、退款金额、退款原因等信息。 2. 生成签名:使用微信支付提供的签名算法对退款请求进行签名,确保数据的安全性。 3. 发送退款请求:使用Java的Http请求库向微信支付接口发送退款请求,并将签名、订单信息等参数传递给接口。 4. 处理应答:接收微信接口返回的响应结果,包括退款是否成功、返回的错误信息等。 5. 处理结果:根据接口返回的结果进行相应的处理,如果退款成功,则更新订单状态并通知用户退款完成;如果退款失败,则根据返回的错误信息进行处理。 Java微信退款V3具有以下特点: 1. 安全可靠:使用微信支付提供的签名算法对退款请求进行签名,确保数据传输的安全性。 2. 简单易用:通过Java代码构建退款请求对象,方便快捷地实现退款操作。 3. 实时性好:通过Http请求将退款请求发送给微信支付接口,实时地获取退款结果。 4. 丰富的功能:除了基本的退款功能外,Java微信退款V3还支持退款查询、退款通知等附加功能。 总之,Java微信退款V3是一种方便快捷、安全可靠的退款解决方案,可以方便地实现退款操作,并提供了丰富的功能以满足不同业务需求。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值