java支付宝第三方支付详解

1.引入支付宝sdk文件。

		<dependency>
		  <groupId>com.alipay.sdk</groupId>
		  <artifactId>alipay-sdk-java</artifactId>
		  <version>3.1.0</version>
		</dependency>

2. 写好配置文件properties,这里重点强调,支付接口中调用的是支付宝公钥而非商户公钥,如果写错会导致验签失败

#alipay
#支付接口
ias.pay.alipay.payUrl=https://openapi.alipay.com/gateway.do
#支付成功回调接口
ias.pay.alipay.notifyUrl=
# 商户ID
ias.pay.alipay.appId=
#编码格式
ias.pay.alipay.charset=UTF-8
#商户私钥
ias.pay.alipay.appPrivateKey=
#支付宝公钥
ias.pay.alipay.publicKey=
ias.pay.alipay.timeoutExpress=30m
#签名加密方式
ias.pay.alipay.signType=RSA2

3.调起支付测试用例。里面的payProp为properties文件的配置项目

	@Autowired
	private PayProp payProp;
	
	@Test
	public void createPay() {
		// 实例化客户端
		AlipayClient alipayClient = new DefaultAlipayClient(payProp.getAlipay().getPayUrl()
				, payProp.getAlipay().getAppId()
				, payProp.getAlipay().getAppPrivateKey()
				, "json"
				, payProp.getAlipay().getCharset()
				, payProp.getAlipay().getPublicKey()
				, payProp.getAlipay().getSignType());
		// 实例化具体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");
		model.setOutTradeNo(SequenceUtils.genId()+"");
		model.setTimeoutExpress("30m");
		model.setTotalAmount("0.01");
		model.setProductCode("QUICK_MSECURITY_PAY");
		request.setBizModel(model);
		request.setNotifyUrl(payProp.getAlipay().getNotifyUrl());
		try {
			// 这里和普通的接口调用不同,使用的是sdkExecute,生成支付号
			AlipayTradeAppPayResponse response = alipayClient.sdkExecute(request);
			if(response.isSuccess()){
				//这里返回response.getBody()给支付宝
			}
			log.info(response.getBody());// 就是orderString
		} catch (AlipayApiException e) {
			e.printStackTrace();
		}
	}

4.付款成功,支付宝回调验证签名,完成支付

	@RequestMapping(value="alipay/notify")
	@SneakyThrows
    public String alipay(@RequestBody String callback) {
		log.debug("支付宝支付回调为:{}", callback);
        //解析出url参数中的键值对转化为Map
		Map<String, String> map = HttpUtil.ParamRequest(callback);
		if(StringUtil.equals(map.get("trade_status"), "TRADE_SUCCESS")) {
            //支付宝验签
			boolean signVerified = AlipaySignature.rsaCheckV1(map, payProp.getAlipay().getPublicKey(), payProp.getAlipay().getCharset(), payProp.getAlipay().getSignType());
   			if(signVerified) {
				log.info("支付宝回调签名认证成功");
			    log.info("支付宝支付完成!!!");
			}
		}
		return "success";
	}

猜你喜欢

转载自blog.csdn.net/qq_27507937/article/details/81479631
今日推荐