首先我们需要准备需要
附下载链接:https://render.alipay.com/p/f/fd-jwq8nu2a/pages/home/index.html
附下载链接:[https://hsk.oray.com/download/]
(https://hsk.oray.com/download/)
手机上需要的应用
附沙箱钱包地址
支付宝开放平台官方
附官方链接:https://openhome.alipay.com/platform/banner.htm
登陆以后进入
找到
打开idea创建config文件夹下创建AliPayController类(自定义名字)
复制 实例代码
package com.example.trade_2000828.controller;/**
* 作者: MrNie
* 时间: 2020/8/28 14:49
* 描述:
*/
import com.alipay.api.AlipayApiException;
import com.alipay.api.AlipayClient;
import com.alipay.api.DefaultAlipayClient;
import com.alipay.api.domain.AlipayTradeAppPayModel;
import com.alipay.api.internal.util.AlipaySignature;
import com.alipay.api.request.AlipayTradeAppPayRequest;
import com.alipay.api.response.AlipayTradeAppPayResponse;
import com.example.trade_2000828.util.R;
import com.example.trade_2000828.util.RandomNum;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import javax.servlet.http.HttpServletRequest;
import java.util.HashMap;
import java.util.Iterator;
import java.util.Map;
/**
* 作者: MrNie
* 时间: 2020/8/28 14:49
* 描述:
*/
@RestController
public class AliPayController {
/**
* app的id
*/
public final static String APP_ID = "";
/**
* 应用密钥
*/
public final static String APP_PRIVATE_KEY = "";
/**
*编码
*/
public final static String CHARSET = "UTF-8";
/**
* 支付宝公钥ALIPAY_PUBLIC_KEY
*/
public final static String ALIPAY_PUBLIC_KEY = "";
/**
*
*/
public final static String GATEWAY_URL = "https://openapi.alipaydev.com/gateway.do";
public final static String FORMAT = "json";
public final static String SIGN_TYP = "RSA2";
@RequestMapping("/getOrderInfo")
public String getOrderInfo(){
//实例化客户端
AlipayClient alipayClient = new DefaultAlipayClient(GATEWAY_URL, APP_ID, APP_PRIVATE_KEY, FORMAT, CHARSET, ALIPAY_PUBLIC_KEY, SIGN_TYP);
//实例化具体API对应的request类,类名称和接口名称对应,当前调用接口名称:alipay.trade.app.pay
AlipayTradeAppPayRequest request = new AlipayTradeAppPayRequest();
//SDK已经封装掉了公共参数,这里只需要传入业务参数。以下方法为sdk的model入参方式(model和biz_content同时存在的情况下取biz_content)。
AlipayTradeAppPayModel model = new AlipayTradeAppPayModel();
model.setBody("我是测试数据");
model.setSubject("App支付测试Java");
//一个小的随机订单
RandomNum randomNum = new RandomNum();
model.setOutTradeNo(randomNum.num());
model.setTimeoutExpress("30m");
model.setTotalAmount("1");
model.setProductCode("QUICK_MSECURITY_PAY");
request.setBizModel(model);
request.setNotifyUrl("http://这里必须是外网链接/notify_url");
try {
//这里和普通的接口调用不同,使用的是sdkExecute
AlipayTradeAppPayResponse response = alipayClient.sdkExecute(request);
System.out.println(response.getBody());//就是orderString 可以直接给客户端请求,无需再做处理。
return R.success(response.getBody());
} catch (AlipayApiException e) {
e.printStackTrace();
}
return R.fail(null,null);
}
}
这里我们要把
AlipayClient alipayClient = new DefaultAlipayClient(GATEWAY_URL, APP_ID, APP_PRIVATE_KEY, FORMAT, CHARSET, ALIPAY_PUBLIC_KEY, SIGN_TYP);
的有参拿出来设置常量
RandomNum类的一个小的随机订单号
package com.example.trade_2000828.util;/**
* 作者: MrNie
* 时间: 2020/8/31 11:37
* 描述:
*/
import java.text.SimpleDateFormat;
import java.util.Date;
/**
* 作者: MrNie
* 时间: 2020/8/31 11:37
* 描述:
*/
public class RandomNum{
static Integer num = 0;
final static String num2 = "0000";
public String num(){
SimpleDateFormat formatter = new SimpleDateFormat("yyyyMMddHHmmss");
String date = formatter.format(new Date());
num++;
num = num++;
return date+num2+Integer.toString(num);
}
public static void main(String[] args){
RandomNum a = new RandomNum();
for (int i = 0;i<99999;i++){
String q = a.num();
System.out.println(q);
}
}
}
然后找到
复制在getOrderInfo下面
package com.example.trade_2000828.controller;/**
* 作者: MrNie
* 时间: 2020/8/28 14:49
* 描述:
*/
import com.alipay.api.AlipayApiException;
import com.alipay.api.AlipayClient;
import com.alipay.api.DefaultAlipayClient;
import com.alipay.api.domain.AlipayTradeAppPayModel;
import com.alipay.api.internal.util.AlipaySignature;
import com.alipay.api.request.AlipayTradeAppPayRequest;
import com.alipay.api.response.AlipayTradeAppPayResponse;
import com.example.trade_2000828.util.R;
import com.example.trade_2000828.util.RandomNum;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import javax.servlet.http.HttpServletRequest;
import java.util.HashMap;
import java.util.Iterator;
import java.util.Map;
/**
* 作者: MrNie
* 时间: 2020/8/28 14:49
* 描述:
*/
@RestController
public class AliPayController {
/**
* app的id
*/
public final static String APP_ID = "";
/**
* 应用密钥
*/
public final static String APP_PRIVATE_KEY = "";
/**
*编码
*/
public final static String CHARSET = "UTF-8";
/**
* 支付宝公钥ALIPAY_PUBLIC_KEY
*/
public final static String ALIPAY_PUBLIC_KEY = "";
/**
* 网关
*/
public final static String GATEWAY_URL = "";
public final static String FORMAT = "json";
public final static String SIGN_TYP = "RSA2";
@RequestMapping("/getOrderInfo")
public R getOrderInfo(){
//实例化客户端
AlipayClient alipayClient = new DefaultAlipayClient(GATEWAY_URL, APP_ID, APP_PRIVATE_KEY, FORMAT, CHARSET, ALIPAY_PUBLIC_KEY, SIGN_TYP);
//实例化具体API对应的request类,类名称和接口名称对应,当前调用接口名称:alipay.trade.app.pay
AlipayTradeAppPayRequest request = new AlipayTradeAppPayRequest();
//SDK已经封装掉了公共参数,这里只需要传入业务参数。以下方法为sdk的model入参方式(model和biz_content同时存在的情况下取biz_content)。
AlipayTradeAppPayModel model = new AlipayTradeAppPayModel();
model.setBody("我是测试数据");
model.setSubject("App支付测试Java");
RandomNum randomNum = new RandomNum();
model.setOutTradeNo(randomNum.num());
model.setTimeoutExpress("30m");
model.setTotalAmount("1");
model.setProductCode("QUICK_MSECURITY_PAY");
request.setBizModel(model);
request.setNotifyUrl("http://这里只能是外网ip/notify_url");
try {
//这里和普通的接口调用不同,使用的是sdkExecute
AlipayTradeAppPayResponse response = alipayClient.sdkExecute(request);
System.out.println(response.getBody());//就是orderString 可以直接给客户端请求,无需再做处理。
return R.success(response.getBody());
} catch (AlipayApiException e) {
e.printStackTrace();
}
return R.fail(null,null);
}
@PostMapping("/notify_url")
public String notify_url(HttpServletRequest request){
Map<String,String> params = new HashMap<String,String>();
Map requestParams = request.getParameterMap();
for (Iterator iter = requestParams.keySet().iterator(); iter.hasNext();) {
String name = (String) iter.next();
String[] values = (String[]) requestParams.get(name);
String valueStr = "";
for (int i = 0; i < values.length; i++) {
valueStr = (i == values.length - 1) ? valueStr + values[i]
: valueStr + values[i] + ",";
}
//乱码解决,这段代码在出现乱码时使用。
//valueStr = new String(valueStr.getBytes("ISO-8859-1"), "utf-8");
params.put(name, valueStr);
}
//切记alipaypublickey是支付宝的公钥,请去open.alipay.com对应应用下查看。
//boolean AlipaySignature.rsaCheckV1(Map<String, String> params, String publicKey, String charset, String sign_type)
try {
boolean flag = AlipaySignature.rsaCheckV1(params, ALIPAY_PUBLIC_KEY, CHARSET,SIGN_TYP);
if (!flag){
return "fail";
}
System.out.println("修改订单成功");
return "success";
} catch (AlipayApiException e) {
e.printStackTrace();
return "fail";
}
}
}
这样所有的代码都准备好了,开始配置常量
进入管理中心
找到
然后我们就找到了app id和网关
打开开发助手点击生成就可以获得密钥这里的密钥就是我们的一个常量,和公钥
复制公钥
至
就会生成支付宝密钥(常量)
这里的域名需要购买,但也有2个免费
http需要6块钱,也可以不买
内网主机是你的wifi或者热点的
ipv4地址
端口号是你项目设置的
这里记得设置花生壳(外网)的访问地址
然后就可以运行/getOrderInfo方法了,运行结果:
这时
控制台会输出交易链接
复制打开手机上的客户端调试点击去支付默认密码111111
账户金额不足可以来此充值