关键词:
支付宝二维码支付、java实现、沙箱测试版
实现功能:java后台代码按照参数生成相应订单,转到HTML页面展示订单二维码,用户扫码支付结束后,进行页面跳转。
首先我们创建一个新的Java项目,正常的项目即可
然后我们需要下载调用支付宝接口所需要的jar包
下载网址:https://openhome.alipay.com/doc/sdkDownload.resource?sdkType=JAVA
其中readme.txt中的内容如下
按照你们使用不同开发工具的不同方式导入这些包,我为了省事就全部都放进去了。
然后就是代码
首先是我们收款方商户信息的配置,我们创建一个类,工具类,名字随意,但是要保证和类名一致
public class AlipayConfig {
// 支付宝网关
public static String gatewayUrl = "https://openapi.alipaydev.com/gateway.do";
// 应用ID,你的APPID
public static String app_id = "2016101800711866";
// 应用私钥,您的PKCS8格式RSA2私钥
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";
/*
在这之后应该再写一个函数,用来记录支付信息,做日志或者数据记录,感兴趣的可以自行查找相关代码。
*/
}
简单介绍一下这些字段的含义
支付宝网关 gatewayUrl 内容就是我们在沙箱环境里面,网页自动生成的支付宝网关,例如:https://openapi.alipaydev.com/gateway.do
APPID app_id 即沙箱环境里面,自动生成的APPID
应用私钥 merchant_private_key 为密钥生成器中生成的应用私钥
支付宝公钥 alipay_public_key 为在沙箱应用中我们通过设置应用公钥,页面自动生成的支付宝公钥
服务器异步通知页面路径 notify_url 当支付结束时返回的状态,包括支付成功、支付失败、支付超时等等。对于初学入门者,非必填项。
页面跳转同步通知页面路径 return_url 就是支付结束之后,页面的跳转页。对于初学入门者,非必填项。
剩下的签名方式和字符编码格式都可以照抄,其中RSA2就是密钥生成器中你所选择的密钥长度。
import com.alipay.api.AlipayClient;
import com.alipay.api.DefaultAlipayClient;
import com.alipay.api.request.AlipayTradePagePayRequest;
public class PayUtil {
public static void main(String[] args) {
// 取当期时间为订单号;订单总额;订单商品名称;订单商品描述
System.out.println(alipay(System.currentTimeMillis()+"","0.1","新春大礼包!!!促销版","测试使用"));
}
/**
*
* @param outTradeNo 商户订单号,商户网站订单系统中唯一订单号,必填 可以使用当前时间
* @param totalAmount 付款金额,必填
* @param subject 主题
* @param body 商品描述,可空
* @return
*/
public static String alipay(String outTradeNo,String totalAmount,String subject,String body) {
//获得初始化的AlipayClient对象,这个时候就把我们在AlipayConfig中设置的收款方商户信息设置进去了
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);
try {
alipayRequest.setBizContent("{\"out_trade_no\":\""+ outTradeNo +"\"," // 设置订单号
+ "\"total_amount\":\""+ totalAmount +"\"," // 设置订单总额
+ "\"subject\":\""+ subject +"\"," // 设置订单主题
+ "\"timeout_express\":\"10m\"," // 设置该订单最晚付款时间,这里设置的是10分钟
+ "\"body\":\""+ body +"\"," // 设置该订单商品的描述
// + "\"qr_pay_mode\":\""+ Constants.QR_PAY_MODE +"\","
+ "\"product_code\":\"FAST_INSTANT_TRADE_PAY\"}");
// 发起生成订单请求
String result = alipayClient.pageExecute(alipayRequest).getBody();
return result;
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
return null;
}
}
}
然后我们就可以直接运行程序了,运行程序之后可以看到控制台输出了一段HTML代码
我们在桌面新建一个HTML文件,然后使用VSCode打开,将这段代码放进HTML的之间。(也可以不用VSCode,正常使用记事本打开也可以,只要代码如下即可)
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<meta http-equiv="X-UA-Compatible" content="ie=edge">
<title>Document</title>
</head>
<body>
<form name="punchout_form" method="post" action="">
<input type="hidden" name="biz_content" value="{"out_trade_no":"1579352440693","total_amount":"0.1","subject":"新春大礼包!!!促销版","timeout_express":"10m","body":"测试使用","product_code":"FAST_INSTANT_TRADE_PAY"}">
<input type="submit" value="立即支付" style="display:none" >
</form>
<script>document.forms[0].submit();</script>
</body>
</html>
你们的form中的action应该是很长的一段,我在这里把它给删除了。
写好这些代码之后,保存,将这个HTML文件使用浏览器打开,就会看到类似如下的页面
然后就可以使用我们在Android手机上下载的沙箱版支付宝来扫码支付了。
因为这一次我们没有设置支付结束后的跳转页面,所以它不会跳转,会一直保持这种状态,直到支付超时。