700字范文,内容丰富有趣,生活中的好帮手!
700字范文 > 支付宝手机网站支付开发详细流程

支付宝手机网站支付开发详细流程

时间:2022-04-20 15:38:17

相关推荐

支付宝手机网站支付开发详细流程

首先创建调用支付宝支付接口的配置类

public class AlipayConfig {// 商户appidpublic static String APPID = "";// 私钥 pkcs8格式的public static String RSA_PRIVATE_KEY = "";// 服务器异步通知页面路径 需http://或者https://格式的完整路径,不能加?id=123这类自定义参数,必须外网可以正常访问public static String notify_url = "http://yourwebsite/alipay/notify";// 页面跳转同步通知页面路径 需http://或者https://格式的完整路径,不能加?id=123这类自定义参数,必须外网可以正常访问 商户可以自定义同步跳转地址public static String return_url = "http://yourwebsite/alipay/returnurl";// 请求网关地址//public static String URL = "/gateway.do";public static String URL = "/gateway.do";// 编码public static String CHARSET = "UTF-8";// 返回格式public static String FORMAT = "json";// 支付宝公钥public static String ALIPAY_PUBLIC_KEY = "";// 日志记录目录public static String log_path = "/paylog";// RSA2public static String SIGNTYPE = "RSA2";}

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

//前台发起支付请求submits(){debuggerconst options = {method: 'POST',headers: { 'content-type': 'application/x-www-form-urlencoded' },url:'/pictureweb/alipay/pay',};axios(options).then((res)=>{debuggerthis.showSubmitPage = false;const form = res.data;const div = document.createElement('div');div.id = 'alipay';div.innerHTML = form;document.body.appendChild(div);document.querySelector('#alipay').children[0].submit(); // 执行后会唤起支付宝})},

@PostMapping("/pay")public void pay(HttpServletRequest request, HttpServletResponse response) throws Exception {// 商户订单号,商户网站订单系统中唯一订单号,必填String out_trade_no = UUID.randomUUID().toString();logger.debug("========>1,生成的out_trade_no为"+out_trade_no+"<===========");//user表增加订单号String userName = (String) request.getAttribute("userName");User user = new User();user.setUserName(userName);user.setOutTradeNo(out_trade_no);user.setFlag(0);userService.updateByUserName(user);// 订单名称,必填String subject = "测试";// 付款金额,必填String total_amount = "1";// 商品描述,可空String body = "测试";// 超时时间 可空String timeout_express = "2m";// 销售产品码 必填String product_code = "QUICK_WAP_PAY";/**********************/// SDK 公共请求类,包含公共请求参数,以及封装了签名与验签,开发者无需关注签名与验签//调用RSA签名方式AlipayClient client = new DefaultAlipayClient(AlipayConfig.URL, AlipayConfig.APPID, AlipayConfig.RSA_PRIVATE_KEY, AlipayConfig.FORMAT, AlipayConfig.CHARSET, AlipayConfig.ALIPAY_PUBLIC_KEY, AlipayConfig.SIGNTYPE);AlipayTradeWapPayRequest alipay_request = new AlipayTradeWapPayRequest();// 封装请求支付信息AlipayTradeWapPayModel model = new AlipayTradeWapPayModel();model.setOutTradeNo(out_trade_no);model.setSubject(subject);model.setTotalAmount(total_amount);model.setBody(body);model.setTimeoutExpress(timeout_express);model.setProductCode(product_code);alipay_request.setBizModel(model);// 设置异步通知地址alipay_request.setNotifyUrl(AlipayConfig.notify_url);// 设置同步地址alipay_request.setReturnUrl(AlipayConfig.return_url);// form表单生产String form = "";try {// 调用SDK生成表单form = client.pageExecute(alipay_request).getBody();response.setContentType("text/html;charset=" + AlipayConfig.CHARSET);response.getWriter().write(form);//直接将完整的表单html输出到页面response.getWriter().flush();response.getWriter().close();} catch (AlipayApiException e) {e.printStackTrace();}}

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

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

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

@PostMapping("/notify")public void notify(HttpServletRequest request, HttpServletResponse response) throws Exception {//获取支付宝POST过来反馈信息Map<String, String> params = new HashMap<String, String>();Map requestParams = request.getParameterMap();for (Iterator iter = requestParams.keySet().iterator(); iter.hasNext(); ) {String name = (String) iter.next();String[] values = (String[]) requestParams.get(name);String valueStr = "";for (int i = 0; i < values.length; i++) {valueStr = (i == values.length - 1) ? valueStr + values[i]: valueStr + values[i] + ",";}//乱码解决,这段代码在出现乱码时使用。如果mysign和sign不相等也可以使用这段代码转化//valueStr = new String(valueStr.getBytes("ISO-8859-1"), "gbk");params.put(name, valueStr);}//获取支付宝的通知返回参数,可参考技术文档中页面跳转同步通知参数列表(以下仅供参考)////商户订单号String out_trade_no = new String(request.getParameter("out_trade_no").getBytes("ISO-8859-1"), "UTF-8");//支付宝交易号String trade_no = new String(request.getParameter("trade_no").getBytes("ISO-8859-1"), "UTF-8");//交易状态String trade_status = new String(request.getParameter("trade_status").getBytes("ISO-8859-1"), "UTF-8");//获取支付宝的通知返回参数,可参考技术文档中页面跳转同步通知参数列表(以上仅供参考)////计算得出通知验证结果//boolean AlipaySignature.rsaCheckV1(Map<String, String> params, String publicKey, String charset, String sign_type)boolean verify_result = AlipaySignature.rsaCheckV1(params, AlipayConfig.ALIPAY_PUBLIC_KEY, AlipayConfig.CHARSET, "RSA2");if (verify_result) {//验证成功////请在这里加上商户的业务逻辑程序代码//——请根据您的业务逻辑来编写程序(以下代码仅作参考)——if (trade_status.equals("TRADE_FINISHED")) {logger.debug("========>2,交易状态为TRADE_FINISHED,out_trade_no为"+out_trade_no+"<===========");//支付成功,user表flag置为1User user = new User();user.setOutTradeNo(out_trade_no);user.setFlag(1);userService.updateByOutTradeNo(user);//判断该笔订单是否在商户网站中已经做过处理//如果没有做过处理,根据订单号(out_trade_no)在商户网站的订单系统中查到该笔订单的详细,并执行商户的业务程序//请务必判断请求时的total_fee、seller_id与通知时获取的total_fee、seller_id为一致的//如果有做过处理,不执行商户的业务程序//注意://如果签约的是可退款协议,退款日期超过可退款期限后(如三个月可退款),支付宝系统发送该交易状态通知//如果没有签约可退款协议,那么付款完成后,支付宝系统发送该交易状态通知。} else if (trade_status.equals("TRADE_SUCCESS")) {logger.debug("========>2,交易状态为TRADE_SUCCESS,out_trade_no为"+out_trade_no+"<===========");//支付成功,user表flag置为1User user = new User();user.setOutTradeNo(out_trade_no);user.setFlag(1);userService.updateByOutTradeNo(user);//判断该笔订单是否在商户网站中已经做过处理//如果没有做过处理,根据订单号(out_trade_no)在商户网站的订单系统中查到该笔订单的详细,并执行商户的业务程序//请务必判断请求时的total_fee、seller_id与通知时获取的total_fee、seller_id为一致的//如果有做过处理,不执行商户的业务程序//注意://如果签约的是可退款协议,那么付款完成后,支付宝系统发送该交易状态通知。}//——请根据您的业务逻辑来编写程序(以上代码仅作参考)——//} else {//验证失败//验证失败,user表flag置为3User user = new User();user.setOutTradeNo(out_trade_no);user.setFlag(3);userService.updateByOutTradeNo(user);}}

<!DOCTYPE html><html lang="en"><head><meta charset="UTF-8"><meta name="viewport" content="width=device-width,initial-scale=1.0"><title>支付结果</title><script src="/libs/jquery/2.1.4/jquery.min.js"></script></head><body><h1 id="result">支付确认中。。。。</h1></body><script>$(function () {let out_trade_no = getUrlParam("out_trade_no")window.setInterval(function () {$.ajax({url: "/pictureweb/user/queryFlag",type: 'GET',async: false,cache: false,data:{outTradeNo:out_trade_no},contentType:"application/x-www-form-urlencoded",dataType: 'json',timeout: 60000,success: function (responseObj) {if(responseObj.code=="1"){$("#result").text("");$("#result").text("支付成功,5秒后跳回首页");sessionStorage.setItem("ifPayed","已支付");goForwardToIndex();}},error: function (errMsg) {$("#result").text("支付失败");goForwardToIndex();}});}, 5000)})getUrlParam = function (name) {var reg = new RegExp("(^|&)" + name + "=([^&]*)(&|$)"); //构造一个含有目标参数的正则表达式对象var r = window.location.search.substr(1).match(reg); //匹配目标参数if (r != null) return unescape(r[2]); return null; //返回参数值}goForwardToIndex = function () {window.setTimeout(function () {window.location.href="./index.html"},5000)}</script></html>

分享一些技术学习视频资料:/s/13dbR69NLIEyP1tQyRTl4xw

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。