一、创建应用:
到https://openhome.alipay.com/platform/developerIndex.htm开发者中心创建应用,然后签约手机网站支付,提交审核,一般需要一天时间审核。
二、配置应用信息:
如下图:
因为第三步已经上传了公钥,所以显示如上图。未设置情况显示“设置应用公钥”。
1.设置应用公钥步骤:
到https://doc.open.alipay.com/docs/doc.htm?treeId=291&articleId=105971&docType=1页面根据自己系统下载windows版或者mac版的生成密钥工具,然后按照文档操作即可。
我选择的是PKCS8(JAVA适用),密钥长度选择2048,点击生成密钥后,将商户应用私钥复制到代码中使用,将公钥上传(也就是“设置应用公钥”点击后的文本框,在上图3的位置)。上传成功后如3所示,点击查看支付宝公钥,将公钥粘贴到代码中使用。
三、集成:
官方集成文档地址:https://doc.open.alipay.com/doc2/detail?treeId=203&articleId=105288&docType=1。
demo:
if(request.getParameter("WIDout_trade_no")!=null){ // 商户订单号,商户网站订单系统中唯一订单号,必填 String out_trade_no = "自己设置的订单号"; // 订单名称,必填 String subject = "赛事赞助"; // 付款金额,必填 填每笔订单的金额 String total_amount=100+""; // 商品描述,可空 String body = "钛度杯war3大师赛众筹奖金"; // 超时时间 可空 支付的超时时间,单位是分 String timeout_express="15m"; // 销售产品码 必填 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) { // TODO Auto-generated catch block e.printStackTrace(); } }
关于自定义参数:
该字段可以加自定义参数,但是我用JSON格式字符串会报错,提示系统繁忙,请稍候再试,或者是支付超时,所以最后把参数用String组合了一下,注意必须用URLEncoder编码,代码如下:
String paramsTmp = uname + ":" + sid; String params = null; try { params = URLEncoder.encode(paramsTmp, "UTF-8"); } catch (UnsupportedEncodingException ex) { Logger.getLogger(AlipayService.class.getName()).log(Level.SEVERE, null, ex); } model.setPassbackParams(params);
然后支付宝异步通知会原样带回自定义参数,取参数方法:
String unameStrTmp = request.getParameter("passback_params"); String unameStr = URLDecoder.decode(unameStrTmp, "UTF-8");
不同于取其他参数的方法:
String out_trade_no = new String(request.getParameter("out_trade_no").getBytes("ISO-8859-1"), "UTF-8");
取到参数后就可以根据自己定义的参数类型进行处理了。
四、关于沙箱环境:
1.沙箱环境需要重新在沙箱环境配置应用环境,也就是步骤二。沙箱环境和正式环境的配置有以下五处不同:
//沙箱环境appid,可以在沙箱应用配置找到 public static String APPID = "2016080100144644"; //沙箱环境固定地址 public static String URL = "https://openapi.alipaydev.com/gateway.do"; //沙箱环境下的支付宝公钥(因为用了和正式环境同一套密钥,所以只需要改支付宝公钥即可,如果不是同一套还需要改私钥) public static String ALIPAY_PUBLIC_KEY = ""; //支付宝通知地址,必须外网可以访问,该地址在沙箱环境下可以收到支付宝通知 public static String notify_url_web = "http://101.201.76.66:8080/api/alipay/mobilenotify"; public static String return_url_web = "http://101.201.76.66:8080/app/fund/paycallback";
2.沙箱应用配置、沙箱账号、沙箱工具都可以在开发者中心的如下页面找到。
3.沙箱环境配置好后,需要下载沙箱工具进行测试,也就是一个测试环境下的支付宝app,就是在上图的沙箱工具中进行下载(只有安卓版,没有IOS版),账号在上图沙箱账号中获取,里面有很多钱可以进行测试。
附:支付宝官方沙箱环境使用说明:https://doc.open.alipay.com/doc2/detail.htm?treeId=200&articleId=105311&docType=1
五、测试通过后,记得改回正式环境,然后就可以上线了。
尤其注意集成时如果需要带自定义参数,可能会有问题,当时就是自定义参数坑了半天,同时还要考虑编码。
ps:因为是后端直接返回了form表单,所以前端必须在当前网页打开,不能另起网页,另起网页好像会有问题,就是点下订单了没反应。