文章目录
- 沙盒支付
- 准备
- 配置
- 测试
沙盒支付
这里用的支付宝的一个沙盒环境,是支付宝提供给开发者测试用的。
下面主要梳理一下,支付功能的实现,其实还是很简单的,因为支付宝都提供好了,我们只要调用接口去传入参数即可。
准备
导入依赖
<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 {
// 应用ID
public 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");
//获得初始化的AlipayClient
AlipayClient 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配置我们的订单信息。
生成我们的表单直接返回或者生成连接,它会自动跳转我们的支付页面,这个页面也不需要我们写,都是支付宝提供好的,我们只需要支付即可。
测试
这里支付,我们用支付宝给我们提供的虚拟的账户和密码支付即可。
也可以用手机下载沙盒支付宝登录,扫码支付。
支付成功后,会等几秒自动调用回调函数,返回到我们要跳转的页面。
支付流程成功。