肺腑之言
- 解释一下:沙箱就等于测试环境,没什么神奇的自己玩很简单!!!
- 如有哪里还不够满意,自行百度详细了解!这里只讲重点
- 无论是支付宝还是别的操作,只要是关于密钥始终不要告诉任何人
第一步【进入支付宝官网,注册/登录自己账号】
- https://www.alipay.com/ 点击导航=======》》》我是开发者【可以拿支付宝APP扫码登录】
- https://open.alipay.com/platform/appDaily.htm 直接进入沙箱环境
- 沙箱环境配置,百度或CSDN直接搜索:沙箱环境配置
第二步【下载支付宝开放平台开发助手,配置密钥】
根据自己的系统型号下载:https://opendocs.alipay.com/common/02khjo
第三步【下载沙箱APP,用于付款】
登录账号使用沙箱账号【使用买家账号登录,这里信息没有截屏防止别人也可以用你的账号】
第四步【导入依赖,配置支付宝信息】
<dependency>
<groupId>com.alipay.sdk</groupId>
<artifactId>alipay-sdk-java</artifactId>
<version>3.3.49.ALL</version>
</dependency>
package cn.itrip.trade.sdk.alipay;
public class AlipayConfig {
// 商户appid
public static String APPID = "自己的APPid";
//私钥 pkcs8格式的
public static String RSA_PRIVATE_KEY = "\\\到沙箱应用的去复制///";
// 服务器异步通知页面路径 注意看路径格式,不可带参数 http://u2pjmk.natappfree.cc 使用的natAPP
public static String notify_url = "http://u2pjmk.natappfree.cc/trade/api/aliNotify";
// 页面跳转同步通知页面路径 需http://或者https://格式的完整路径,不能加?id=123这类自定义参数,必须外网可以正常访问 商户可以自定义同步跳转地址
public static String return_url = "http://商户网关地址/alipay.trade.wap.pay-JAVA-UTF-8/return_url.jsp";
// 请求网关地址
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";
}
第五步【下载natapp实现内网穿透】
所谓内网穿透:
支付宝【支付成功、失败】时,需要返回信息给我们,但是支付宝无法调用我们本机的端口,这里就需要用到第三方代理工具来代理我们本地端口,让支付宝可以可以访问到:本次使用的是natapp,当然这个代理工具看你自己,用哪一种不重要!!!
第六步【实现Controller编写】
@Controller
@RequestMapping("/api")
public class PayController {
@Resource
private OrderService orderService;
/**
* 发起下单信息
* @param orderNo 订单号
* @param req
* @param resp
* @throws AlipayApiException
* @throws IOException
*/
@GetMapping("/prepay/{orderNo}")
public void prepay(@PathVariable String orderNo,
HttpServletRequest req,
HttpServletResponse resp) throws AlipayApiException, IOException {
req.setCharacterEncoding("UTF-8");
resp.setContentType("text/html;charset=UTF-8");
AlipayClient alipayClient = new DefaultAlipayClient(AlipayConfig.URL,
AlipayConfig.APPID,AlipayConfig.RSA_PRIVATE_KEY,
"json",AlipayConfig.CHARSET,AlipayConfig.ALIPAY_PUBLIC_KEY,AlipayConfig.SIGNTYPE);
AlipayTradePagePayRequest request = new AlipayTradePagePayRequest();
request.setNotifyUrl(AlipayConfig.notify_url);
//查询订单信息
ItripHotelOrder orderInfo = orderService.queryOrderInfo(orderNo);
//订单必传信息
JSONObject bizContent = new JSONObject();
bizContent.put("out_trade_no",orderInfo.getOrderNo());
bizContent.put("total_amount", orderInfo.getPayAmount());
bizContent.put("subject", orderInfo.getHotelName());
bizContent.put("product_code", "FAST_INSTANT_TRADE_PAY");
request.setBizContent(bizContent.toString());
AlipayTradePagePayResponse response = alipayClient.pageExecute(request);
if(response.isSuccess()){
System.out.println("调用成功");
} else {
System.out.println("调用失败");
}
//response.getBody() 直接获取支付宝返回的页面,响应出去
resp.getWriter().print(response.getBody());
}
/**
* 支付宝异步回调
* @param req
* @throws Exception
*/
@PostMapping("/aliNotify")
public void aliNotify(HttpServletRequest req) throws Exception {
System.err.println("JSONObject.toJSONString(req.getParameterMap()) = \n" +
JSONObject.toJSONString(req.getParameterMap()));
//out_trade_no 下单生成的订单号
//trade_no 支付宝返回的订单号
Map<String, String[]> map = req.getParameterMap();
String outTradeNo = map.get("out_trade_no")[0];
String aliTradeNo = map.get("trade_no")[0];
//修改订单状态 减去实时库存
orderService.updateOrderStatusANDtempStore(outTradeNo,aliTradeNo);
}
}