web项目中使用支付宝接口

前言

一直想弄一个有关于支付的第三方接口调用的web项目,网上看了一大堆资料,最后还是选择了使用支付宝。原因有一下两点:

  1. 不用另外注册账户(一直讨厌注册各种账户)
  2. 支付宝有沙箱功能,可以实现虚拟支付,适合拿来练手

下面就进入正题吧

进入沙箱

支付宝扫码登录蚂蚁金服开放平台之后,在首页的常用功能那里进入沙箱应用,如果是第一次使用,就需要添加功能。参考下图
蚂蚁金服开放平台

生成RSA密钥

进入沙箱应用之后可以看到信息配置部分需要设置RSA2(SHA256)密钥,由于我已经设置过了,这里就没有相应的截图。

生成RSA密钥的工具官方也提供了,直接查看生成RSA密钥进入下载工具,并按照步骤就可以生成密钥了。

上传密钥

通过上一步生成的密钥,直接在沙箱应用中上传,如果验证通过的话,就可以开始接入代码了。
密钥上传成功

下载demo

在官网中下载demo:https://docs.open.alipay.com/270/106291/ ,将demo解压。然后下载沙箱版的支付宝(只支持安卓版),然后回到沙箱环境中,查看沙箱账号,用买家信息登录。

沙箱买家

合并入自己的项目

下面就以一个简单的例子开始,具体步骤如下:

  1. 将解压文件中的jar包放入项目lib中,把 jsp文件 或者自己写的页面复制入项目,
  2. 修改AlipayConfig文件的部分配置
  3. 编写简单的servlet
  4. 运行查看支付

详细的目录结构如下:
目录

AlipayConfig:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
public class AlipayConfig {

//↓↓↓↓↓↓↓↓↓↓请在这里配置您的基本信息↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓

// 应用ID,您的APPID,收款账号既是您的APPID对应支付宝账号
public static String app_id = "填入沙箱APPID";

// 商户私钥,您的PKCS8格式RSA2私钥
public static String merchant_private_key = "填入你的密钥";

// 支付宝公钥,查看地址:https://openhome.alipay.com/platform/keyManage.htm 对应APPID下的支付宝公钥。
public static String alipay_public_key = "填入公钥";

// 服务器异步通知页面路径 需http://格式的完整路径,不能加?id=123这类自定义参数,必须外网可以正常访问
public static String notify_url = "http://localhost:8080/alipay.trade.page.pay-JAVA-UTF-8/notify_url.jsp";

// 页面跳转同步通知页面路径 需http://格式的完整路径,不能加?id=123这类自定义参数,必须外网可以正常访问
public static String return_url = "http://localhost:8080/alipay.trade.page.pay-JAVA-UTF-8/return_url.jsp";

// 签名方式
public static String sign_type = "RSA2";

// 字符编码格式
public static String charset = "utf-8";

// 支付宝网关
public static String gatewayUrl = "https://openapi.alipaydev.com/gateway.do";

// 支付宝网关
public static String log_path = "C:\\";

servlet代码:

这里写了一个简单的doGet方法,当请求这个servlet的时候就会执行支付,然后使用沙箱版的支付宝直接扫码或者网页登录沙箱应用账号就可以支付了

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
//获得初始化的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 = "20181037";
//付款金额,必填
String total_amount = "9999";
//订单名称,必填
String subject = "支付宝测试";
//商品描述,可空
String body = "商品描述";

alipayRequest.setBizContent("{\"out_trade_no\":\""+ out_trade_no +"\","
+ "\"total_amount\":\""+ total_amount +"\","
+ "\"subject\":\""+ subject +"\","
+ "\"body\":\""+ body +"\","
+ "\"product_code\":\"FAST_INSTANT_TRADE_PAY\"}");

//请求
String result;
try {
result = alipayClient.pageExecute(alipayRequest).getBody();
response.setContentType("text/html;charset=" + AlipayConfig.charset);
response.getWriter().write(result);//直接将完整的表单html输出到页面
response.getWriter().flush();
response.getWriter().close();
} catch (AlipayApiException e) {
e.printStackTrace();
response.getWriter().write("捕获异常出错");
response.getWriter().flush();
response.getWriter().close();
}


}

效果:

支付

这时候直接使用沙箱版扫码支付就可以了
从此不用担心的问题,随心所欲,不用家里有矿也有花不完的钱!!!

0%