文章目录
- 沙盒支付
- 准备
- 配置
- 测试
沙盒支付
这里用的支付宝的一个沙盒环境,是支付宝提供给开发者测试用的。
下面主要梳理一下,支付功能的实现,其实还是很简单的,因为支付宝都提供好了,我们只要调用接口去传入参数即可。
准备
导入依赖
<dependency><groupId>com.alipay.sdk</groupId><artifactId>alipay-sdk-java</artifactId><version>3.3.49.ALL</version></dependency>
进入支付包开方平台
https://auth.alipay.com/login/ant_sso_index.htm?goto=https%3A%2F%2Fopen.alipay.com%2Fdevelop%2Fsandbox%2Fapp
进入沙盒应用,可以看到一些参数,都是我们要用到的
接口价签方式我这里用的是自定义的密钥,也可以使用提供的默认密钥。
利用支付宝的工具可以生成应用公钥和私钥,公钥复制到自定义设置中,即可生成支付宝公钥。
配置
ssm项目中添加配置类。
然后将将你的appid,应用私钥,支付宝公钥,复制粘贴到对应参数上。
notify回调函数也就是支付成功的调用路径。
package com.qcby.controller.Config;import org.springframework.context.annotation.Configuration;@Configuration
public class AlipayConfig {// 应用IDpublic static String app_id = "";// 商户私钥public static String merchant_private_key = "";// 支付宝公钥public static String alipay_public_key = "";// 服务器异步通知页面路径,public static String notify_url = "";// 页面跳转同步通知页面路径, 成功跳转public static String return_url = "";// 签名方式public static String sign_type = "RSA2";// 字符编码格式public static String charset = "utf-8";// 支付宝网关public static String gatewayUrl = "";}
也可以写一个properties文件, 然后配置类中导入。
支付宝回调只能回调公网中的地址,所以这里我们需要用到一个工具。
natapp,用于内网穿透,把我们的端口号映射到公网上,可以访问到。
申请一个免费的,映射上你需要的端口号,复制authtoken。
下载app
创建一个bat在同目录下,配置上你的authtoken.
启动:
可以看到已经给你配置了一个地址映射你本地的端口。
我们将此地址复制,在回调函数中替换我们的端口。
注意:每次启动地址都不一样,所以每次需要重新配置。
然后编写接口即可。
/*** 订单支付功能* @param request* @param response* @throws IOException*/@ResponseBody@RequestMapping("/pay")public void payController(HttpServletRequest request, HttpServletResponse response) throws IOException {request.setCharacterEncoding("utf-8");response.setContentType("text/html;charset=utf-8");//获得初始化的AlipayClientAlipayClient alipayClient = new DefaultAlipayClient(AlipayConfig.gatewayUrl, AlipayConfig.app_id, AlipayConfig.merchant_private_key, "json", AlipayConfig.charset, AlipayConfig.alipay_public_key, AlipayConfig.sign_type);//设置请求参数AlipayTradePagePayRequest alipayRequest = new AlipayTradePagePayRequest();alipayRequest.setReturnUrl(AlipayConfig.return_url);alipayRequest.setNotifyUrl(AlipayConfig.notify_url);// 商户订单号String out_trade_no = getOrderNo();// 付款金额String total_amount = request.getParameter("money");// 订单名称String subject = request.getParameter("order_name");// 商品描述String body = request.getParameter("describe");alipayRequest.setBizContent("{\"out_trade_no\":\"" + out_trade_no + "\"," + "\"total_amount\":\"" + total_amount+ "\"," + "\"subject\":\"" + subject + "\"," + "\"body\":\"" + body + "\","+ "\"product_code\":\"FAST_INSTANT_TRADE_PAY\"}");System.out.println("{\"out_trade_no\":\"" + out_trade_no + "\"," + "\"total_amount\":\"" + total_amount + "\","+ "\"subject\":\"" + subject + "\"," + "\"body\":\"" + body + "\","+ "\"product_code\":\"FAST_INSTANT_TRADE_PAY\"}");//请求// String form = "";String s = "";try {// form = alipayClient.pageExecute(alipayRequest).getBody(); //调用SDK生成表单//get方式请求,即生成url链接s = alipayClient.pageExecute(alipayRequest,"GET").getBody();} catch (AlipayApiException e) {e.printStackTrace();}// 将支付表单嵌入HTML并输出到页面// System.out.println(form);System.out.println(s);response.setContentType("text/html;charset=" + AlipayConfig.charset);response.getWriter().write(s);//直接将完整的表单html输出到页面response.getWriter().flush();response.getWriter().close();}
传入我们的订单信息,如订单编号,金额,描述等,可以查看支付宝给的参数解析,参数的规则, setBizContent配置我们的订单信息。
生成我们的表单直接返回或者生成连接,它会自动跳转我们的支付页面,这个页面也不需要我们写,都是支付宝提供好的,我们只需要支付即可。
测试
这里支付,我们用支付宝给我们提供的虚拟的账户和密码支付即可。
也可以用手机下载沙盒支付宝登录,扫码支付。
支付成功后,会等几秒自动调用回调函数,返回到我们要跳转的页面。
支付流程成功。