java 阿里 app支付

首先 引用 阿里 支付 jar 包

<dependency>
			<groupId>alipay</groupId>
			<artifactId>alipay-sdk</artifactId>
			<version>java20170615110434</version>
		</dependency>

阿里支付逻辑是 先通过app 调用后台接口 生成支付订单 ,然后 阿里会回调 后台接口 核对支付订单
最后 app回调后台接口 确认有没有支付成功

首先 调用支付接口

 @RequestMapping(value = "/payApply", method = RequestMethod.POST)
	@ResponseBody
	public R payApply(@RequestParam() Map<String, String> allParams) {

		if (allParams.get("userId") == null) {
				return R.error(ResultStatusCode.MISSING_PARAMS);
			}
			if (allParams.get("userId").equalsIgnoreCase("")) {
				return R.error(ResultStatusCode.INVALID_PARAMS);
			}
			// 查询用户
			AppUser user = appLogin1Service.selectAppUserByPrimaryKey(Integer.parseInt(allParams.get("userId")));
			AppPayRecord record = new AppPayRecord();
			record.setPayUser(user.getId());
			record.setPayFee(param.getpValue());
			record.setOutTradeNo(getOutTradeNo());
			record.setStatus(0);       //生成支付记录 
			if (appPayService.insertSelective(record) > 0) {
				SysParam seviceCharge = sysParamMapper.selectByPrimaryKey("service_charge");
				AlipayClient alipayClient = new DefaultAlipayClient("https://openapi.alipay.com/gateway.do", ALI_APPID,
						ALI_PRIVATE_KEY, "json", "utf-8", ALI_PUBLIC_KEY, "RSA2");
				// 实例化具体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(seviceCharge.getpName());
				model.setOutTradeNo(record.getOutTradeNo());
				model.setTimeoutExpress("30m");
				model.setTotalAmount(seviceCharge.getpValue().toString());
				model.setProductCode("QUICK_MSECURITY_PAY");
				request.setBizModel(model);
				//这里配置  支付宝回调接口路径
				request.setNotifyUrl(ALI_NOTIFY_URL);

				// 这里和普通的接口调用不同,使用的是sdkExecute
				AlipayTradeAppPayResponse response = alipayClient.sdkExecute(request);

				Map<String, Object> map = new HashMap<String, Object>();
				map.put("orderInfo", response.getBody());

				return R.ok().put("data", map);
			} else {
				return R.error("数据库插入失败");
			}
	}

支付宝回调接口

@RequestMapping(value = "/paySuccessNotify", method = RequestMethod.POST)
	//@ControllerPermission(value = ControllerPermissionType.PUBLIC)
	@ResponseBody
	public String paySuccessNotify(HttpServletRequest request) {

		try {

			// 获取到返回的所有参数 先判断是否交易成功trade_status 再做签名校验
			// 1、商户需要验证该通知数据中的out_trade_no是否为商户系统中创建的订单号,
			// 2、判断total_amount是否确实为该订单的实际金额(即商户订单创建时的金额),
			System.out.println("trade_stataus-------------" + request.getParameter("trade_status"));
			if (request.getParameter("trade_status") != null
					&& "TRADE_SUCCESS".equals(request.getParameter("trade_status"))) {
				Enumeration<?> pNames = request.getParameterNames();
				Map<String, String> param = new HashMap<String, String>();

				while (pNames.hasMoreElements()) {
					String pName = (String) pNames.nextElement();
					param.put(pName, request.getParameter(pName));
					System.out.println(pName + "---------------------" + param.get(pName));
				}

				boolean signVerified = AlipaySignature.rsaCheckV1(param, ALI_PUBLIC_KEY, "utf-8", "RSA2"); // 校验签名是否正确
				System.out.println("signVerified-------------" + signVerified);
				if (signVerified) {
						/***
						这里写 回调成功后的代码逻辑
						*/
						接的  recorde  里面的status 设置为 1
					}
					}

最后app回调后台接口
查询订单状态是否为 1

猜你喜欢

转载自blog.csdn.net/qq_41684939/article/details/83016898