沙箱
Alipay
根据这里商家的账号信息,配置沙箱环境下的appId
,商户private key
,支付宝公钥(设置商户私钥之后会自动在账户信息处生成)。然后下载这里的沙箱app,登陆客户账户,然后就可以付款。付款成功之后,便会回调我们设置的回调地址。
微信沙箱环境的key需要根据真实的key生成,并且有时间限制,需要注意
// 微信的sdk需要去官网下载
WXPay wxpay = new WXPay(config, true, true);
String retrieveSandboxSignKey(WXPayConfig config) {
try {
Map<String, String> params = new HashMap<>();
params.put("mch_id", config.getMchID());
params.put("nonce_str", WXPayUtil.generateNonceStr());
params.put("sign", WXPayUtil.generateSignature(params, config.getKey()));
String strXML = wxpay.requestWithoutCert("/sandboxnew/pay/getsignkey",
params, config.getHttpConnectTimeoutMs(), config.getHttpReadTimeoutMs());
if (StringUtils.isBlank(strXML)) {
throw new SandboxUnavailableException();
}
Map<String, String> result = WXPayUtil.xmlToMap(strXML);
logger.info("retrieve SandboxSignKey:" + result);
if ("SUCCESS".equals(result.get("return_code"))) {
return result.get("sandbox_signkey");
}
throw new SandboxUnavailableException();
} catch (Exception e) {
logger.error("sandbox_signkey exception", e);
throw new SandboxUnavailableException(e);
}
}
微信没有沙箱app,所以当扫码支付,H5支付等接口返回正确的二维码或者url之后,微信会默认支付已经成功,立即调用回调接口。
回调
使用 Spring MVC 接收回调的controller写法
- 支付宝
- 回调请求虽然是post,但是由于media type是“application/x-www-form-urlencoded”,需要使用
@RequestParam
来接收; - 返回值要用
MediaType.TEXT_PLAIN_VALUE
- 回调请求虽然是post,但是由于media type是“application/x-www-form-urlencoded”,需要使用
- 微信
- 返回值要用
MediaType.APPLICATION_XML_VALUE
- 返回值要用
@RestController
@RequestMapping("/callback")
public class PaymentCallBackController {
// consume "application/x-www-form-urlencoded"
@RequestMapping(value = "/ali", method = RequestMethod.POST, produces = MediaType.TEXT_PLAIN_VALUE)
public String alipay(@RequestParam Map<String, String> body) throws Exception {
return paymentService.ackAli(body);
}
@RequestMapping(value = "/wx", method = RequestMethod.POST, produces = MediaType.APPLICATION_XML_VALUE)
public String wx(@RequestBody String notifyData) throws Exception {
Map<String, String> notifyMap = WXPayUtil.xmlToMap(notifyData);
return WXPayUtil.mapToXml(paymentService.ackWeChat(notifyMap));
}
}
Written with StackEdit.
评论
发表评论