JAVA对接阿里扫码支付接口整理笔记
注册沙箱账号
到蚂蚁金服注册开发者账号,注册地址:https://open.alipay.com,用你的 支付宝 账号扫码登录,完善个人信息,选择服务类型。
根据情况选择接入方式,我们这里选择自研开发者,如果已经注册过的省略。
选择 开发服务 –> 研发服务 –> 沙箱,进入沙箱管理界面。
进入沙箱,第一次需要填写信息,记下appId,公钥设置处需要把下面步骤生成的公钥设置到这里。
生成公私秘钥
登录官方地址: https://docs.open.alipay.com/291/105971,进入秘钥生成页面。
下载相应的工具。
打开下载的工具,运行程序,选择 JAVA 2048 方式,点击生成秘钥。
把此处生成的公钥复制设置到沙箱环境,就是上面的设置公钥配置,然后把公私秘钥保存起来,以备后用。
添加依赖
添加项目依赖,主要是引入 alipay-sdk-java,提供支付宝支付支持。
pom.xml:
配置信息文件
因技术问题,暂且将相关信息以死值固定。
支付宝支付接口封装
AlipayUtil是对支付宝支付功能的封装。
AlipayUtil.java:
@Component
public class AlipayUtil {
/**
* 支付接口
*
* @param alipayBean
* @return
* @throws AlipayApiException
*/
public String pay(AlipayBean alipayBean) throws AlipayApiException
{
// 1、获得初始化的AlipayClient
String serverUrl = PropertiesConfig.GATEWAY_URL;
String appId = PropertiesConfig.APP_ID;
String privateKey = PropertiesConfig.PRIVARY_KEY;
String format = “json”;
String charset = PropertiesConfig.CHARSET;
String
alipayPublicKey = PropertiesConfig.PUBLIC_KEY;
String signType = PropertiesConfig.SIGN_TYPE;
String returnUrl = PropertiesConfig.RETURN_URL;
String notifyUrl = PropertiesConfig.NOTIFY_URL;
AlipayClient
alipayClient = new DefaultAlipayClient(serverUrl, appId, privateKey, format, charset, alipayPublicKey, signType);
// 2、设置请求参数
AlipayTradePagePayRequest
alipayRequest = new AlipayTradePagePayRequest();
// 页面跳转同步通知页面路径
alipayRequest.setReturnUrl(returnUrl);
// 服务器异步通知页面路径
alipayRequest.setNotifyUrl(notifyUrl);
// 封装参数
alipayRequest.setBizContent(JSON.toJSONString(alipayBean));
// 3、请求支付宝进行付款,并获取支付结果(报500,有问题)
// String result =
alipayClient.pageExecute(alipayRequest).getBody(); //调用SDK生成表单
//通过以下代码进行提交请求会默认返回请求url字符串(返回url,打开跳转支付宝支付页面)
String result = alipayClient.pageExecute(alipayRequest, “GET”).getBody();
//扫二维码支付(将response的qr_code制作成二维码)
//创建API对应的request类
// AlipayTradePrecreateRequest
request = new AlipayTradePrecreateRequest ();
//
request.setNotifyUrl(“http://hj51eut.nat.ipyingshe.com:80/order/aliPayCallBack.do”);
// request . setBizContent (
“{” +
//
“\’out_trade_no\’:\'”+alipayBean.getOut_trade_no()+”\’,”
+ //商户订单号
//
“\”total_amount\”:\'”+alipayBean.getTotal_amount()+”\’,” +
//
“\”subject\”:\'”+alipayBean.getSubject()+”\’,” +
//
“\”store_id\”:\”NJ_001\”,” +
//
“\”timeout_express\”:\'”+alipayBean.getTimeout_express()+”\’}”
); //订单允许的最晚付款时间
//
AlipayTradePrecreateResponse response = alipayClient.execute (request);
// //制作二维码
// String body =
response.getBody();
// JSONObject jsonObject = JSONObject.fromObject(body);
// String qr_code =
jsonObject.getJSONObject(“alipay_trade_precreate_response”).getString(“qr_code”);
// 返回付款信息
return result;
}
}
接口调用参数封装对象如下。
AlipayBean.java
/**
* 支付实体对象
* 根据支付宝接口协议,其中的属性名,必须使用下划线,不能修改
* @author suntong
*/
@Data
public class AlipayBean {
/**
* 商户订单号,必填
*
*/
private String out_trade_no;
/**
* 订单名称,必填
*/
private String subject;
/**
* 付款金额,必填
* 根据支付宝接口协议,必须使用下划线
*/
private String total_amount;
/**
* 商品描述,可空
*/
private String body;
/**
* 超时时间参数
*/
private String timeout_express= “10m”;
//商户门店编号
private String store_id;
/**
* 产品编号
*/
private String product_code= “FAST_INSTANT_TRADE_PAY”;
public String getOut_trade_no() {
return out_trade_no;
}
public void setOut_trade_no(String out_trade_no) {
this.out_trade_no
= out_trade_no;
}
public String getSubject() {
return subject;
}
public void setSubject(String subject)
{
this.subject =
subject;
}
public String getTotal_amount() {
return total_amount;
}
public void setTotal_amount(String total_amount) {
this.total_amount
= total_amount;
}
public String getBody() {
return body;
}
public void setBody(String body) {
this.body = body;
}
public String getTimeout_express() {
return timeout_express;
}
public void setTimeout_express(String timeout_express) {
this.timeout_express
= timeout_express;
}
public String getProduct_code() {
return product_code;
}
public void setProduct_code(String product_code) {
this.product_code
= product_code;
}
public String getStore_id() {
return store_id;
}
public void setStore_id(String store_id) {
this.store_id
= store_id;
}
}
订单业务封装
订单业务提供支付宝支付接口 alipay,内部通过调用 PayService 完成订单支付。
OrderController.java
/* 订单接口 */
@Controller
@RequestMapping("/home/order")
public class OrderController {
@Autowired
private PayService payService;//调用支付服务
/*阿里支付*/
@PostMapping("/alipay")
@ResponseBody
public AjaxResult alipay(String out_trade_no, String subject, String total_amount, String body,Long courseId) throws AlipayApiException {
//发起支付
AlipayBean alipayBean = new AlipayBean();
alipayBean.setOut_trade_no(out_trade_no);
alipayBean.setSubject(subject);
alipayBean.setTotal_amount(total_amount);
String ids= courseId +","+ student.getStudentId();
alipayBean.setBody(ids);
String qr_code=payService.aliPay(alipayBean);
return AjaxResult.success(qr_code);
}
}
PayService 封装了 Alipay, 统一对外提供的支付服务接口。
PayService.java
/**
* 支付服务
* @author suntong
*/
public interface PayService {
/**
* 支付宝支付接口
* @param
alipayBean
* @return
* @throws AlipayApiException
*/
String aliPay(AlipayBean
alipayBean) throws AlipayApiException;
}
支付服务的实现类,通过对各种支付代码的调用,统一对外提供支付服务。
PayServiceImpl.java
@Service
public class PayServiceImpl implements PayService {
@Autowired
private AlipayUtil alipay;
@Override
public String aliPay(AlipayBean alipayBean) throws AlipayApiException {
return alipay.pay(alipayBean);
}
}
测试页面
创建一个 index.html 页面,用于输入订单信息,并进行支付。
(必备字段)
<dt>商户订单号 :</dt>
<dd>
<input id="WIDout_trade_no" name="out_trade_no"/>
</dd>
<hr class="one_line">
<dt>订单名称 :</dt>
<dd>
<input id="WIDsubject" name="subject"/>
</dd>
<hr class="one_line">
<dt>付款金额 :</dt>
<dd>
<input id="WIDtotal_amount" name="total_amount"/>
</dd>
内网穿透
若项目在内网的环境下,并且需要进行支付成功后回调,需进行内网穿透。
以下将使用免费的工具(闪库)进行操作。