当咱们申请签约好当面付功能之后怎么用Java代码调用该支付接口呢?我只创建了三个Java类。
controller commen qrcode
controller用来写调用支付接口的,commen用来写全局变量,例如APPID,URL这些。
qrcode是生成二维码的工具类,因为在当面付的官方说明文档里写着要开发者用工具转换返回的链接生成二维码,所以这里用到一个生成二维码的工具类。
看图:
commen
qrcode
controller
@GetMapping("/alipay")
public void demo (HttpServletResponse response2) throws Exception {
AlipayClient alipayClient = new DefaultAlipayClient( Commen.URL , Commen.APPID , Commen.APP_PRIVATE_KEY , Commen.FORMAT, Commen.CHARSET , Commen.ALIPAY_PUBLIC_KEY , Commen.SIGN_TYPE ); //获得初始化的AlipayClient
AlipayTradePrecreateRequest request = new AlipayTradePrecreateRequest (); //创建API对应的request类
request.setNotifyUrl("http://mk9zr5.natappfree.cc/cs/retrun");//设置回调通知地址
request.setReturnUrl("http://www.baidu.com");
request . setBizContent ( "{" +
"\"out_trade_no\":\"20150320010101018\"," + //商户订单号
"\"total_amount\":\"0.01\"," +
"\"subject\":\"Iphone6 16G\"," +
"\"store_id\":\"NJ_001\"," +
"\"timeout_express\":\"90m\"}" ); //订单允许的最晚付款时间
AlipayTradePrecreateResponse response = null;
try {
response = alipayClient.execute (request);
} catch (AlipayApiException e) {
e.printStackTrace();
}
//根据response中的结果继续业务逻辑处
Map map = JsonToMapUtil.analysis(JSON.parseObject(response.getBody()));
Qrcode.produceQR(response2,map.get("qr_code")+"");
}
我在这里设置了回调通知地址是用的内网穿透的一个地址,实际上是我本地localhost,回调方法如下:
@PostMapping("/retrun")
public void callback(HttpServletRequest request,HttpServletResponse response) throws Exception {
InputStream inStream = request.getInputStream();
BufferedReader in = null;
String result = "";
in = new BufferedReader(
new InputStreamReader(inStream));
String line;
while ((line = in.readLine()) != null) {
result += line;
}
Map<String,Object> map = new HashMap<>();
String[] split = result.split("&");
for (String s : split) {
String[] spl = s.split("=");
String key = spl[0];
String value = URLDecoder.decode(spl[1], "UTF-8");// UTF-8解码
map.put(key,value);
}
// 打印success字节流传给支付宝服务器
System.out.println("================================= 支付成功 =================================");
Writer out= new BufferedWriter(new OutputStreamWriter(response.getOutputStream()));
out.write("success"); //一定要打印success
out.flush();
out.close();
System.out.println("付款时间是"+map.get("gmt_payment"));
System.out.println("支付宝交易订单号"+map.get("trade_no"));
System.out.println("商户订单号"+map.get("out_trade_no"));
System.out.println("订单金额"+map.get("total_amount"));
System.out.println("订单状态"+map.get("trade_status"));
System.out.println(map.toString());
}
回调的意思是用户扫码付款成功后,会有一个异步通知,是支付宝官方通知我们用户已经支付成功了,我们需要给支付宝一个回调的地址让他有地方通知过来。然后我是写成了map,一个一个打印出来了。
详细的代码已经上传了,只需要更改你的APPID参数即可:https://download.csdn.net/download/weixin_42167600/19988100