求助:支付宝电脑端扫码支付--验签失败
private String getAlipayUrl(Order order) {
AlipayClient alipayClient = new DefaultAlipayClient(properties.getGatewayUrl(), properties.getAppId(), properties.getAppPrivateKey(), properties.getFormat(), "utf-8", properties.getAppPublicKey(), properties.getSignType());
AlipayTradePagePayRequest request = new AlipayTradePagePayRequest();
request.setNotifyUrl(properties.getNotifyUrl());
request.setReturnUrl(properties.getReturnUrl());
JSONObject bizContent = new JSONObject();
bizContent.put("out_trade_no", order.getZforderId());
bizContent.put("total_amount", order.getAmount());
bizContent.put("subject", "测试");
bizContent.put("product_code", "FAST_INSTANT_TRADE_PAY");
request.setBizContent(bizContent.toString());
AlipayTradePagePayResponse response = null;
try {
response = alipayClient.pageExecute(request, "POST");
} catch (AlipayApiException e) {
e.printStackTrace();
}
String pageRedirectionData = response.getBody();
System.out.println(pageRedirectionData);
if (response.isSuccess()) {
System.out.println("调用成功");
} else {
System.out.println("调用失败");
}
return pageRedirectionData;
}
编码是utf-8时支付页面报错……大概subject是汉字的原因,换成GBK,subject能正常显示且能扫码支付成功,但异步回调时又验签失败……(subject是英文可以)
异步回调代码
@Override
public Map<String, String> alipayNotify(HttpServletRequest request) {
Map<String, String> paramsMap = new HashMap();
Map<String, String[]> requestParams = request.getParameterMap();
try {
for (Iterator<String> iter = requestParams.keySet().iterator(); iter.hasNext(); ) {
String name = iter.next();
String[] values = requestParams.get(name);
String valueStr = "";
for (int i = 0; i < values.length; i++) {
valueStr = (i == values.length - 1) ? valueStr + values[i]
: valueStr + values[i] + ",";
}
//乱码解决,这段代码在出现乱码时使用
valueStr = new String(valueStr.getBytes(properties.getCharset()), properties.getCharset());
paramsMap.put(name, valueStr);
}
boolean signVerified = AlipaySignature.rsaCheckV1(paramsMap, properties.getAppPublicKey(), properties.getCharset(), properties.getSignType());
if (signVerified) {
//商户订单号
String out_trade_no = request.getParameter("out_trade_no");
AlipayClient alipayClient = new DefaultAlipayClient(properties.getGatewayUrl(),properties.getAppId(),properties.getAppPrivateKey(),properties.getFormat(),properties.getCharset(),properties.getAppPublicKey(),properties.getSignType());
AlipayTradeQueryRequest tradeQueryRequest = new AlipayTradeQueryRequest();
JSONObject bizContent = new JSONObject();
bizContent.put("out_trade_no", out_trade_no);
tradeQueryRequest.setBizContent(bizContent.toString());
AlipayTradeQueryResponse response = alipayClient.execute(tradeQueryRequest);
if(response.isSuccess()){
Order orderInfo = getOne(new QueryWrapper<Order>().eq("zforder_id", out_trade_no));
paySuccess(orderInfo);
} else {
System.out.println("调用失败");
}
paramsMap.put("status", "success");
return paramsMap;
} else {
System.err.println("异步签名校验有误,返回fail");
paramsMap.put("status", "fail");
return paramsMap;
}
} catch (Exception e) {
e.printStackTrace();
paramsMap.put("status", "fail");
return paramsMap;
}
}
请各位大神在线指教!!!