文章目录
- 前言
- 准备工作
- 环境配置
- 沙箱环境配置
- 1、沙箱应用配置信息
- 2、设置RSA2
- 正式环境配置
- 1、创建应用
- 2、添加支付能力
- 3、设置RSA2加密
- Spring配置
- 1、Maven引入相关依赖库
- 2、Alipay相关配置
- 3、手机网页发起支付
- 4、支付结果通知监听
前言
最近在做支付宝wap网页支付(手机端访问网页,调起手机中的支付宝APP支付),查看了官方文档也在网上找了很多资料,但感觉没有一篇比较完整的真正的从零开始接入的教程,此处总结记录一下,方便之后查阅。
参考文档:
- 1、支付宝手机网页唤醒app支付
- 2、官方文档
- 3、IJPay
准备工作
1、注册商家支付宝账号并进行企业实名认证 ,注册地址选择企业账户
2、准备域名主体和企业支付宝主体一致的域名;
3、签约支付接口选择手机网站支付,进行签约。
以上为正式环境准备工作,同时支付宝提供了沙箱环境用于开发测试,沙箱环境地址,这里将分别介绍沙箱环境和正式环境的集成方式(集成方式差不多)
环境配置
沙箱环境配置
1、沙箱应用配置信息
沙箱环境配置如下图,其中APPID和RSA2会在代码中配置,后续会介绍
2、设置RSA2
使用支付宝密钥生成器生成公钥,如下图
将应用公钥填入,应用私钥本地保存代码集成会使用到。
正式环境配置
正式环境配置和沙箱环境配置差不多,需要先创建应用—>选择开通的支付服务—>生成密钥并上传。
1、创建应用
2、添加支付能力
记得选择手机网站支付并签约。
3、设置RSA2加密
同沙箱环境加密设置
Spring配置
使用了IJPay,具体可查看IJPay官方文档
1、Maven引入相关依赖库
<dependency>
<groupId>com.alipay.sdk</groupId>
<artifactId>alipay-sdk-java</artifactId>
<version>4.10.58.ALL</version>
</dependency>
<dependency>
<groupId>com.github.javen205</groupId>
<artifactId>IJPay-AliPay</artifactId>
<version>2.6.3</version>
</dependency>
2、Alipay相关配置
// 商户appid
public static String APPID = "应用AppId";
// 私钥 pkcs8格式的
public static String RSA_PRIVATE_KEY = "生成的应用私钥";
// 页面跳转同步通知页面路径 需http://或者https://格式的完整路径,不能加?id=123这类自定义参数,必须外网可以正常访问 商户可以自定义同步跳转地址
public static String return_url = "";
// 服务器异步通知页面路径 需http://或者https://格式的完整路径,不能加?id=123这类自定义参数,必须外网可以正常访问
public static String notify_url = "";
//正式环境支付宝网关地址
// public static String URL = "https://openapi.alipay.com/gateway.do";
//沙箱环境网关地址
public static String URL = "https://openapi.alipaydev.com/gateway.do";
// 编码
public static String CHARSET = "UTF-8";
// 返回格式
public static String FORMAT = "json";
// 支付宝公钥
public static String ALIPAY_PUBLIC_KEY = "生成的应用公钥";
// 日志记录目录
public static String log_path = "/log";
// RSA2
public static String SIGNTYPE = "RSA2";
3、手机网页发起支付
@RequestMapping("/wapPay.do")
public void wapPay(HttpServletRequest request,HttpServletResponse response){
String body = "测试手机网页支付";
String subject = "测试";
String totalAmount = "0.1";
AlipayTradeWapPayModel model = new AlipayTradeWapPayModel();
model.setBody(body);
model.setSubject(subject);
model.setTotalAmount(totalAmount);
model.setTimeoutExpress("1d");//有效时间
model.setOutTradeNo("");//系统内部订单ID (系统内唯一)
model.setProductCode("");//系统内产品编码
AliPayApiConfigKit.putApiConfig(queryApiPayConfig);
AliPayApi.wapPay(response,model,return_url,notify_url)
}
public AliPayApiConfig queryApiPayConfig(){
AliPayApiConfig aliPayApiConfig;
try{
aliPayApiConfig = AliPayApiConfigKit.getApiConfig(APPID);
}catch(Exception e){
aliPayApiConfig = AliPayApiConfig.builder().setAppId(APPID).setAliPayPublicKey(ALIPAY_PUBLIC_KEY).
setCharset("UTF-8").setPrivateKey(RSA_PRIVATE_KEY).setServiceUrl(URL).setSignType("RSA2").build();
}
return aliPayApiConfig;
}
4、支付结果通知监听
同步通知
@RequestMapping("/return_url")
public void aliPayReturn(HttpServletRequest request,HttpServletResponse response,AliPayReturn aliPayReturn){
Map<String,String> map = AliPayApi.toMap(request);
boolean verifyResult = AlipaySignature.rsaCheckV1(map,ALIPAY_PUBLIC_KEY,CHARSET,SIGNTYPE);
if(verifyResult){ //验证通过,商户在此处加入自己的逻辑代码
}
}
异步通知
@RequestMapping("/notify_url")
public String notifyUrl(HttpServletRequest request,AliPayReturn aliPayReturn){
Map<String,String> map = AliPayApi.toMap(request);
boolean verifyResult = AlipaySignature.rsaCheckV1(map,ALIPAY_PUBLIC_KEY,CHARSET,SIGNTYPE);
if(verifyResult){ //验证通过,商户在此处加入自己的逻辑代码
return "success";
}else{
return "failure";
}
}