您好,欢迎您来河南大都市!
河南大都市

支付宝手机支付开发入门详解

来源:阅读:-2020-08-21 04:21:05
分享:

前台页面发起支付请求,后台调支付宝SDK提供的API,返回一个form表单到前台,前台直接发送支付请求,唤起支付宝支付页面


  1. //前台发起支付请求
  2. submits(){
  3. debugger
  4. const options = {
  5. method: 'POST',
  6. headers: { 'content-type': 'application/x-www-form-urlencoded' },
  7. url:'/pictureweb/alipay/pay',
  8. };
  9. axios(options).then((res)=>{
  10. debugger
  11. this.showSubmitPage = false;
  12. const form = res.data;
  13. const div = document.createElement('div');
  14. div.id = 'alipay';
  15. div.innerHTML = form;
  16. document.body.appendChild(div);
  17. document.querySelector('#alipay').children[0].submit(); // 执行后会唤起支付宝
  18. })
  19. },
  20. @PostMapping("/pay")
  21. public void pay(HttpServletRequest request, HttpServletResponse response) throws Exception {
  22. // 商户订单号,商户网站订单系统中唯一订单号,必填
  23. String out_trade_no = UUID.randomUUID().toString();
  24. logger.debug("========>1,生成的out_trade_no为"+out_trade_no+"<===========");
  25. //user表增加订单号
  26. String userName = (String) request.getAttribute("userName");
  27. User user = new User();
  28. user.setUserName(userName);
  29. user.setOutTradeNo(out_trade_no);
  30. user.setFlag(0);
  31. userService.updateByUserName(user);
  32. // 订单名称,必填
  33. String subject = "测试";
  34. // 付款金额,必填
  35. String total_amount = "1";
  36. // 商品描述,可空
  37. String body = "测试";
  38. // 超时时间 可空
  39. String timeout_express = "2m";
  40. // 销售产品码 必填
  41. String product_code = "QUICK_WAP_PAY";
  42. /**********************/
  43. // SDK 公共请求类,包含公共请求参数,以及封装了签名与验签,开发者无需关注签名与验签
  44. //调用RSA签名方式
  45. AlipayClient client = new DefaultAlipayClient(AlipayConfig.URL, AlipayConfig.APPID, AlipayConfig.RSA_PRIVATE_KEY, AlipayConfig.FORMAT, AlipayConfig.CHARSET, AlipayConfig.ALIPAY_PUBLIC_KEY, AlipayConfig.SIGNTYPE);
  46. AlipayTradeWapPayRequest alipay_request = new AlipayTradeWapPayRequest();
  47. // 封装请求支付信息
  48. AlipayTradeWapPayModel model = new AlipayTradeWapPayModel();
  49. model.setOutTradeNo(out_trade_no);
  50. model.setSubject(subject);
  51. model.setTotalAmount(total_amount);
  52. model.setBody(body);
  53. model.setTimeoutExpress(timeout_express);
  54. model.setProductCode(product_code);
  55. alipay_request.setBizModel(model);
  56. // 设置异步通知地址
  57. alipay_request.setNotifyUrl(AlipayConfig.notify_url);
  58. // 设置同步地址
  59. alipay_request.setReturnUrl(AlipayConfig.return_url);
  60. // form表单生产
  61. String form = "";
  62. try {
  63. // 调用SDK生成表单
  64. form = client.pageExecute(alipay_request).getBody();
  65. response.setContentType("text/html;charset=" + AlipayConfig.CHARSET);
  66. response.getWriter().write(form);//直接将完整的表单html输出到页面
  67. response.getWriter().flush();
  68. response.getWriter().close();
  69. } catch (AlipayApiException e) {
  70. e.printStackTrace();
  71. }
  72. }


return_url配置的是支付成功后的同步回调路径,也就是支付成功后,支付宝要访问的你的服务器路径,这个路径必须是外网可以访问的,这样支付宝才能调的通。可以在这个回调函数中做一些处理后跳转到一个页面,比如下面代码所示,验证成功后,跳转到paysuccess.html页面。


  1. @GetMapping("/returnurl")
  2. public void returnUrl(HttpServletRequest request, HttpServletResponse response) throws Exception {
  3. //获取支付宝GET过来反馈信息
  4. Map params = new HashMap();
  5. Map requestParams = request.getParameterMap();
  6. for (Iterator iter = requestParams.keySet().iterator(); iter.hasNext(); ) {
  7. String name = (String) iter.next();
  8. String[] values = (String[]) requestParams.get(name);
  9. String valueStr = "";
  10. for (int i = 0; i < values.length; i++) {
  11. valueStr = (i == values.length - 1) ? valueStr + values[i]
  12. : valueStr + values[i] + ",";
  13. }
  14. //乱码解决,这段代码在出现乱码时使用。如果mysign和sign不相等也可以使用这段代码转化
  15. valueStr = new String(valueStr.getBytes("ISO-8859-1"), "utf-8");
  16. params.put(name, valueStr);
  17. }
  18. //获取支付宝的通知返回参数,可参考技术文档中页面跳转同步通知参数列表(以下仅供参考)//
  19. //商户订单号
  20. String out_trade_no = new String(request.getParameter("out_trade_no").getBytes("ISO-8859-1"), "UTF-8");
  21. //支付宝交易号
  22. String trade_no = new String(request.getParameter("trade_no").getBytes("ISO-8859-1"), "UTF-8");
  23. //获取支付宝的通知返回参数,可参考技术文档中页面跳转同步通知参数列表(以上仅供参考)//
  24. //计算得出通知验证结果
  25. //boolean AlipaySignature.rsaCheckV1(Map params, String publicKey, String charset, String sign_type)
  26. boolean verify_result = AlipaySignature.rsaCheckV1(params, AlipayConfig.ALIPAY_PUBLIC_KEY, AlipayConfig.CHARSET, "RSA2");
  27. if (verify_result) {//验证成功
  28. //////////////////////////////////////////////////////////////////////////////////////////
  29. //请在这里加上商户的业务逻辑程序代码
  30. //验证成功跳转到前台支付结果页面
  31. response.sendRedirect("http://ip:port/paysuccess.html?out_trade_no="+out_trade_no);
  32. //——请根据您的业务逻辑来编写程序(以上代码仅作参考)——
  33. //////////////////////////////////////////////////////////////////////////////////////////
  34. } else {
  35. //该页面可做页面美工编辑
  36. response.sendRedirect("http://ip:port/payfail.html");
  37. }
  38. }

在这个paysuccess.html页面中可以每几秒去查询下自己的数据库中订单的状态,这个状态是支付宝通过异步回调notify_url配置的路径来修改的,当支付宝修改了订单状态,前台页面查询到后即可跳转到一个指定页面,支付完成。


  1. @PostMapping("/notify")
  2. public void notify(HttpServletRequest request, HttpServletResponse response) throws Exception {
  3. //获取支付宝POST过来反馈信息
  4. Map params = new HashMap();
  5. Map requestParams = request.getParameterMap();
  6. for (Iterator iter = requestParams.keySet().iterator(); iter.hasNext(); ) {
  7. String name = (String) iter.next();
  8. String[] values = (String[]) requestParams.get(name);
  9. String valueStr = "";
  10. for (int i = 0; i < values.length; i++) {
  11. valueStr = (i == values.length - 1) ? valueStr + values[i]
  12. : valueStr + values[i] + ",";
  13. }
  14. //乱码解决,这段代码在出现乱码时使用。如果mysign和sign不相等也可以使用这段代码转化
  15. //valueStr = new String(valueStr.getBytes("ISO-8859-1"), "gbk");
  16. params.put(name, valueStr);
  17. }
  18. //获取支付宝的通知返回参数,可参考技术文档中页面跳转同步通知参数列表(以下仅供参考)//
  19. //商户订单号
  20. String out_trade_no = new String(request.getParameter("out_trade_no").getBytes("ISO-8859-1"), "UTF-8");
  21. //支付宝交易号
  22. String trade_no = new String(request.getParameter("trade_no").getBytes("ISO-8859-1"), "UTF-8");
  23. //交易状态
  24. String trade_status = new String(request.getParameter("trade_status").getBytes("ISO-8859-1"), "UTF-8");
  25. //获取支付宝的通知返回参数,可参考技术文档中页面跳转同步通知参数列表(以上仅供参考)//
  26. //计算得出通知验证结果
  27. //boolean AlipaySignature.rsaCheckV1(Map params, String publicKey, String charset, String sign_type)
  28. boolean verify_result = AlipaySignature.rsaCheckV1(params, AlipayConfig.ALIPAY_PUBLIC_KEY, AlipayConfig.CHARSET, "RSA2");
  29. if (verify_result) {//验证成功
  30. //////////////////////////////////////////////////////////////////////////////////////////
  31. //请在这里加上商户的业务逻辑程序代码
  32. //——请根据您的业务逻辑来编写程序(以下代码仅作参考)——
  33. if (trade_status.equals("TRADE_FINISHED")) {
  34. logger.debug("========>2,交易状态为TRADE_FINISHED,out_trade_no为"+out_trade_no+"<===========");
  35. //支付成功,user表flag置为1
  36. User user = new User();
  37. user.setOutTradeNo(out_trade_no);
  38. user.setFlag(1);
  39. userService.updateByOutTradeNo(user);
  40. //判断该笔订单是否在商户网站中已经做过处理
  41. //如果没有做过处理,根据订单号(out_trade_no)在商户网站的订单系统中查到该笔订单的详细,并执行商户的业务程序
  42. //请务必判断请求时的total_fee、seller_id与通知时获取的total_fee、seller_id为一致的
  43. //如果有做过处理,不执行商户的业务程序
  44. //注意:
  45. //如果签约的是可退款协议,退款日期超过可退款期限后(如三个月可退款),支付宝系统发送该交易状态通知
  46. //如果没有签约可退款协议,那么付款完成后,支付宝系统发送该交易状态通知。
  47. } else if (trade_status.equals("TRADE_SUCCESS")) {
  48. logger.debug("========>2,交易状态为TRADE_SUCCESS,out_trade_no为"+out_trade_no+"<===========");
  49. //支付成功,user表flag置为1
  50. User user = new User();
  51. user.setOutTradeNo(out_trade_no);
  52. user.setFlag(1);
  53. userService.updateByOutTradeNo(user);
  54. //判断该笔订单是否在商户网站中已经做过处理
  55. //如果没有做过处理,根据订单号(out_trade_no)在商户网站的订单系统中查到该笔订单的详细,并执行商户的业务程序
  56. //请务必判断请求时的total_fee、seller_id与通知时获取的total_fee、seller_id为一致的
  57. //如果有做过处理,不执行商户的业务程序
  58. //注意:
  59. //如果签约的是可退款协议,那么付款完成后,支付宝系统发送该交易状态通知。
  60. }
  61. //——请根据您的业务逻辑来编写程序(以上代码仅作参考)——
  62. //////////////////////////////////////////////////////////////////////////////////////////
  63. } else {//验证失败
  64. //验证失败,user表flag置为3
  65. User user = new User();
  66. user.setOutTradeNo(out_trade_no);
  67. user.setFlag(3);
  68. userService.updateByOutTradeNo(user);
  69. }
  70. }
  71. 支付结果
  72. 支付确认中。。。。

推荐阅读:潮品会

免责声明:所有文字、图片、视频、音频等资料均来自互联网,不代表本站赞同其观点,本站亦不为其版权负责。相关作品的原创性、文中陈述文字
无法一一核实,如果您发现本网站上有侵犯您的合法权益的内容,请联系我们,本网站将立即予以删除!联系我们 网站地图 XML地图 TXT
Copyright © 2012-2019 http://www.henands.cn, All rights reserved.