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

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章