最近在做APP,项目中要用支付,就写了下面的支付宝支付!还有微信支付,看下面的文章!
首先呢,先去开发平台上看看介绍,知道你不想看,但有些东西你是需要滴,
比如说
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65
| import lombok.Data; import org.springframework.boot.context.properties.ConfigurationProperties; import org.springframework.stereotype.Component;
/** * 支付宝支付配置文件 * * @author 知吾朱 */ @Data @Component @ConfigurationProperties(prefix = "alipay") public class AliPayConfig {
/** * AppId */ private String appId;
/** * 应用私钥 */ private String privateKey;
/** * 应用公钥 */ private String publicKey;
/** * 支付宝公钥 */ private String aliPayPublicKey;
/** * 异步回调接口 */ private String notifyUrl;
/** * 支付宝网关 */ private String url;
/** * 编码类型 */ private String charset;
/** * 数据类型 */ private String formatType;
/** * 签名类型 */ private String signType;
/** * 域名 */ private String projectDomain;
}
|
这些东西都是你需要的,
1 2 3 4 5 6 7 8 9 10 11
| alipay: appId: 不告诉你,自己去找 privateKey: 好大一串 publicKey: 还是好大一串 aliPayPublicKey: 又是一大串 url: https://openapi.alipay.com/gateway.do charset: UTF-8 formatType: json signType: RSA2 notifyUrl: /pay/aliPay/notify 回调接口 projectDomain: 域名,当然是你的api域名了
|
然后呢,然后就开始敲代码了。
话不多说,上代码。
Maven送上。
1 2 3 4 5 6 7 8 9 10
| <dependency> <groupId>com.aliyun</groupId> <artifactId>aliyun-java-sdk-core</artifactId> <version>3.2.5</version> </dependency> <dependency> <groupId>com.aliyun</groupId> <artifactId>aliyun-java-sdk-dysmsapi</artifactId> <version>1.0.0</version> </dependency>
|
接口送上。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32
| //支付宝需要的参数serverUrl、appId、private_key、format、charset、public_key、signType AlipayClient alipayClient = new DefaultAlipayClient(aliPayConfig.getUrl(), aliPayConfig.getAppId(), aliPayConfig.getPrivateKey(), aliPayConfig.getFormatType(), aliPayConfig.getCharset(), aliPayConfig.getPublicKey(), aliPayConfig.getSignType()); AlipayTradeAppPayRequest payRequest = new AlipayTradeAppPayRequest(); AlipayTradeAppPayModel model = new AlipayTradeAppPayModel(); //商品信息 model.setBody("XXXX-支付测试"); //商品名称 model.setSubject("XXXX-支付测试"); //订单号 model.setOutTradeNo("订单编号(唯一的,自己生成)"); //支付超时时间 model.setTimeoutExpress("30m"); // 支付金额 model.setTotalAmount("钱哦 ,可以填0.01,测试是要花钱的"); payRequest.setBizModel(model); // 回调地址(充值订单) payRequest.setNotifyUrl(aliPayConfig.getProjectDomain() + aliPayConfig.getNotifyUrl()); //这里和普通的接口调用不同,使用的是sdkExecute try { AlipayTradeAppPayResponse response = alipayClient.sdkExecute(payRequest); log.info("支付返回[{}]", response.getBody()); System.out.println(JSONObject.toJSONString(response.getBody())); return ApiResponse.success(response.getBody()).msg("支付成功"); } catch (AlipayApiException e) { return ApiResponse.fail().msg(e.getErrMsg()); }
|
别急,还有呢,你要回调哦,记住回调要用外网能访问到的,支付宝调你的。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49
| @ApiOperation("支付回调") @RequestMapping("/pay/aliPay/notify") public String aliPayNotify(HttpServletRequest request, HttpServletResponse response) { Map<String, String> params = new HashMap<>(); //从支付宝回调的request域中取值 Map<String, String[]> requestParams = request.getParameterMap(); for (String name : requestParams.keySet()) { String[] values = requestParams.get(name); String valueStr = ""; for (int i = 0; i < values.length; i++) { valueStr = (i == values.length - 1) ? valueStr + values[i] : valueStr + values[i] + ","; } // 乱码解决,这段代码在出现乱码时使用。如果mysign和sign不相等也可以使用这段代码转化 // valueStr = new String(valueStr.getBytes("ISO-8859-1"), "gbk"); params.put(name, valueStr); } log.info("回调数据[{}]", JSONObject.toJSONString(params)); //商品订单号 String orderNumber = request.getParameter("out_trade_no"); // 当前交易状态 String tradeStatus = request.getParameter("trade_status"); // 支付金额 String totalAmount = request.getParameter("total_amount"); // 支付时间 String payDate = request.getParameter("gmt_payment"); //3.签名验证(对支付宝返回的数据验证,确定是支付宝返回的) try { boolean signVerified = AlipaySignature.rsaCheckV1(params, aliPayConfig.getAliPayPublicKey(), aliPayConfig.getCharset(), aliPayConfig.getSignType()); //返回状态存入redis中 log.info("验签通过[{}]",signVerified); //对验签进行处理 if (signVerified) { //验签通过 if ("TRADE_SUCCESS".equals(tradeStatus)) { //支付成功后的业务处理 //todo 当然是你自己的业务了,修改支付状态啊。 //添加支付信息 return "success"; } else { return "failure"; } } else { //验签不通过 return "failure"; } } catch (AlipayApiException e) { return "failure"; }
}
|
好了,到这里就结束了,就是这么简单,你学会了吗?