赞
踩
最近空闲时间做了一个关于交易的小项目,还是基于SSM框架,大部分都是一些基础功能,只得说一下的就是支付功能的实现。
从项目一开始,我就没有想其他业务怎么实现,心中一直在想支付功能的实现,就是用户点击结算后生成订单,然后跳转到支付宝支付页面,用户扫码支付,支付成功后,页面进行刷新,就这么一个流程。
昨天,我认真阅读了一下支付宝支付的官方文档,阅读之后,便开始整合。
第一步:登陆支付宝开放平台-开发文档
登陆成功后点击导航栏【开发者中心】
接着点击【沙箱】
我们看到下面界面
这里我们需要注意四个参数
1.APPID:直接使用就可以,这个参数不需要你特意生成,沙箱应用会自动给用户创建好。
2.支付宝网关:直接使用就可以,这里有一个小知识点,需要注意,就是上图中的网关直接拿去用就可以,所有用户的都一样。仔细观察发现,该网关中alipay后面有dev,表明这是开发环境网关。
3.RSA2(SHA256)密钥:需要开发者手动生成密钥(也就是应用私钥)
直接告诉你这个需要用工具生成,很简单,我直接给大家贴上软件网址。
WINDOWS(windows版本工具请不要安装在含有空格的目录路径下)
(1)下载相应环境工具并安装后即可使用,本步骤指引以 MAC_OSX 界面为例,如下图所示:
(2).开发者根据开发语言选择密钥格式和密钥长度,新建应用请务必使用 RSA2密钥长度 即2048 位(目前已使用 RSA 密钥长度即1024 位密钥长度的应用仍然可以正常调用接口)。点击 生成密钥 后,工具会自动生成商户应用公钥(public key)和应用私钥(private key),如下图所示:
通过上面生成密钥的方法就可以生成,应用的私钥和公钥。
复制公钥—点击设置,进行设置就行了。
生成的私钥需妥善保管,避免遗失,不要泄露。应用私钥需填写到代码中供签名时使用。应用公钥需提供给支付宝账号管理者上传到支付宝开放平台。(私钥自己先留着,代码中使用)
4.RSA密钥:分为 【应用公钥】 和 【支付宝公钥】
应用公钥已经设置好了,支付宝公钥直接点击查看就可以了。
上面就是整个的设置过程。下面开始整合。
准备支付宝支付需要的架包。
集成支付宝接口需要引入的文件是:
alipay-sdk-java*.jar
commons-logging-1.1.1.jar
下载地址https://docs.open.alipay.com/54/103419/
首先编写一个支付宝配置类,需要写入上面设置好的一些数据。
AlipayConfig类
import java.io.FileWriter; import java.io.IOException; /* * *类名:AlipayConfig *功能:基础配置类 *详细:设置帐户有关信息及返回路径 *修改日期:2017-04-05 *说明: *以下代码只是为了方便商户测试而提供的样例代码,商户可以根据自己网站的需要,按照技术文档编写,并非一定要使用该代码。 *该代码仅供学习和研究支付宝接口使用,只是提供一个参考。 */ public class AlipayConfig { //↓↓↓↓↓↓↓↓↓↓请在这里配置您的基本信息↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓ // 应用ID,您的APPID,收款账号既是您的APPID对应支付宝账号 public static String app_id = ""; // 商户私钥,您的PKCS8格式RSA2私钥,就是我们用工具生成的,我让你先保存起来的 public static String merchant_private_key = ""; // 支付宝公钥,查看地址:https://openhome.alipay.com/platform/keyManage.htm 对应APPID下的支付宝公钥。 public static String alipay_public_key = ""; // 签名方式 public static String sign_type = "RSA2"; // 字符编码格式 public static String charset = "utf-8"; // 支付宝网关 public static String gatewayUrl = "https://openapi.alipaydev.com/gateway.do"; //↑↑↑↑↑↑↑↑↑↑请在这里配置您的基本信息↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑ }
前端选好物品,生成订单,选择支付后的拦截器
@RequestMapping(value ="/buyshopping",method = RequestMethod.GET) public void buyshopping(@RequestParam String sumPrice, @RequestParam int[] ids, @RequestParam Integer client, HttpServletResponse response) throws IOException { //跳转到支付宝付款页面 AlipayClient alipayClient = new DefaultAlipayClient(AlipayConfig.gatewayUrl, AlipayConfig.app_id,AlipayConfig.merchant_private_key, "json", AlipayConfig.charset, AlipayConfig.alipay_public_key, AlipayConfig.sign_type); // 订单号 String out_trade_no = OrderCodeFactory.getOrderIdByUUID(); out_trade_no = URLDecoder.decode(out_trade_no,"UTF-8"); // 总金额 String total_amount = sumPrice; total_amount = URLDecoder.decode(total_amount,"UTF-8"); // 商品名称,我这里只获取是第一个商品的信息,读者按照实际情况进行编写逻辑 Shopping shoppings = shoppingDao.queryShoppingById(ids[0]); String subject = shoppings.getTitle(); subject = URLDecoder.decode(subject,"UTF-8"); // 商品描述 String body = subject; body = URLDecoder.decode(body,"UTF-8"); AlipayTradePagePayRequest alipayRequest = new AlipayTradePagePayRequest(); ///创建API对应的request //回调函数 alipayRequest.setReturnUrl("success"); alipayRequest.setBizContent("{" + " \"out_trade_no\":\""+ out_trade_no +"\"," + " \"product_code\":\"FAST_INSTANT_TRADE_PAY\"," + " \"total_amount\":"+ total_amount +"," + " \"subject\":\""+ subject +"\"," + " \"body\":\""+ body +"\"" + " }"+ " }"); String form=""; try { form = alipayClient.pageExecute(alipayRequest).getBody(); //调用SDK生成表单 } catch (AlipayApiException e) { e.printStackTrace(); } response.setContentType("text/html;charset=utf-8"); response.getWriter().println(form);//直接将完整的表单html输出到页面 response.getWriter().close(); }
回调函数success,支付成功后做的逻辑,我这个是个例子。
@RequestMapping("/success")
public ModelAndView success(String out_trade_no,Double total_amount){
ModelAndView modelAndView = new ModelAndView();
modelAndView.setViewName("success");
modelAndView.addObject("money",total_amount);
modelAndView.addObject("no",out_trade_no);
return modelAndView;
}
对了,记得下载沙箱版的支付宝,你如果用正式版扫描二维码会提示无效。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。