小程序微信支付
所需工具类及jar包
- 导入微信官方工具包
1、可以验证签名;
2、map转xml以及xml转map等方法;
<dependency>
<groupId>com.github.wxpay</groupId>
<artifactId>wxpay-sdk</artifactId>
<version>0.0.3</version>
</dependency>
- 签名方法
import com.github.wxpay.sdk.WXPayConstants;
import java.io.UnsupportedEncodingException;
import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException;
import java.util.Arrays;
import java.util.Map;
import java.util.Set;
public class WxMD5Util {
public String getSign(Map<String, String> data) throws Exception {
WXConfigUtil config = new WXConfigUtil();
Set<String> keySet = data.keySet();
String[] keyArray = keySet.toArray(new String[keySet.size()]);
Arrays.sort(keyArray);
StringBuilder sb = new StringBuilder();
for (String k : keyArray) {
if (k.equals(WXPayConstants.FIELD_SIGN)) {
continue;
}
// if (data.get(k).trim().length() > 0) // 参数值为空,则不参与签名
// sb.append(k).append("=").append(data.get(k).trim()).append("&");
if (data.get(k).trim().length() > 0) { // 参数值为空,则不参与签名
sb.append(k).append("=").append(data.get(k).trim()).append("&");
}
}
sb.append("key=").append(config.getKey());
MessageDigest md = null;
try {
md = MessageDigest.getInstance("MD5");
} catch (NoSuchAlgorithmException e) {
e.printStackTrace();
}
byte[] array = new byte[0];
try {
array = md.digest(sb.toString().getBytes("UTF-8"));
} catch (UnsupportedEncodingException e) {
e.printStackTrace();
}
StringBuilder sb2 = new StringBuilder();
for (byte item : array) {
sb2.append(Integer.toHexString((item & 0xFF) | 0x100).substring(1, 3));
}
return sb2.toString().toUpperCase();
}
}
统一下单
- 官方文档地址:
https://pay.weixin.qq.com/wiki/doc/api/wxa/wxa_api.php?chapter=9_1
1、按照官方文档封装所需参数;
2、小程序支付openid必传
;
3、使用WXPayUtil.mapToXml
,将参数转成xml,发送POST请求;
4、处理返回参数,如果返回成功,将返回预支付交易会话标志 prepay_id
,封装所需数据返回给小程序端;
支付回调
- 官方文档地址:
https://pay.weixin.qq.com/wiki/doc/api/wxa/wxa_api.php?chapter=9_7&index=8#
1、接收微信回调xml参数,并将xml参数转成map
String resXml = "";
Map<String, String> returnMap = new HashMap<>();
try {
InputStream inputStream = request.getInputStream();
//将InputStream转换成xmlString
BufferedReader reader = new BufferedReader(new InputStreamReader(inputStream));
StringBuilder sb = new StringBuilder();
String line = null;
try {
while ((line = reader.readLine()) != null) {
sb.append(line + "\n");
}
} catch (IOException e) {
System.out.println(e.getMessage());
} finally {
try {
inputStream.close();
} catch (IOException e) {
e.printStackTrace();
}
}
resXml = sb.toString();
Map<String, String> params = WXPayUtil.xmlToMap(resXml);
2、验证签名
boolean signatureValid = WXPayUtil.isSignatureValid(params, 你的APPLET_KEY);
3、根据回调参数,处理自身的业务之后,需向微信支付返回参数
,否则微信会在一段时间内调用回调接口,间歇性进行通知