支付宝电脑网站支付 alipay.trade.page.pay

只涉及支付接口 其他接口没有使用
支付宝官方文档:https://docs.open.alipay.com/270/105899/
支付接口文档 https://docs.open.alipay.com/270/alipay.trade.page.pay/
建议使用沙箱环境进行测试,沙箱接入 https://docs.open.alipay.com/200/105311

具体实现请参考文档和官方demo

注意事项:
请求支付页面
  • 调用sdk的参数封装成静态变量,通过配置文件导入
  • 确认支付宝公钥和商户私钥是否正确, 使用RSA2 签名,回调地址必须外网可以访问到
  • 使用对象封装请求参数
  • goods_detail类型为 com.alipay.api.domain.GoodsDetail
  • JSONObject bizJson = JSONObject.fromObject(bizContent);转为json格式
  • 使用HttpServletResponse 输出页面,避免中文乱码出现
异步回调:
  • 参考文档使用sdk验证签名
  • 注意验证app_id 和 seller_id 等.
package com.youboy.order.controller.callback;

import java.io.UnsupportedEncodingException;
import java.math.BigDecimal;
import java.util.HashMap;
import java.util.Iterator;
import java.util.Map;

import javax.annotation.Resource;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;

import org.apache.log4j.Logger;
import org.springframework.stereotype.Controller;
import org.springframework.ui.ModelMap;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.ResponseBody;

import com.alipay.api.AlipayApiException;
import com.alipay.api.internal.util.AlipaySignature;
import com.youboy.alipay.constant.AlipayConfig;
import com.youboy.memberService.api.IQualificationService;
import com.youboy.order.api.hxpay.IBankDockingRecordsService;
import com.youboy.order.api.hxpay.IBankHxAccountService;
import com.youboy.order.exception.OrderWebOSException;
import com.youboy.pay.api.IPayService;
import com.youboy.pay.api.IPayWorker;
import com.youboy.pay.dto.PayBill;
import com.youboy.pay.dto.bank.BackCode;
import com.youboy.pay.dto.bank.GnetOrder;
import com.youboy.pay.exception.PayWebOSException;
import com.youboy.pay.utils.PaySta;
import com.youboy.shardSessionFilter.MemCacheManagerSpy;

/**
 * 支付宝回调
*/
@Controller
@RequestMapping("/zfb/callback")
public class ZfbPayBackOrderController {

	private final Logger logger = Logger.getLogger(ZfbPayBackOrderController.class);

	/**
	 * 支付宝支付异步回调
	 * @param model
	 * @param request
	 * @param response
	 * @param session
	 * @throws OrderWebOSException
	 */
	@RequestMapping(value = "/payCallBack", method = RequestMethod.POST)
	@ResponseBody
	public String zfbPayCallBack(ModelMap model,
			HttpServletRequest request, HttpServletResponse response,
			HttpSession session) throws OrderWebOSException {
		boolean signVerified = checkRSA(request);
		if (!signVerified) { // 验证失败
			logger.error("不是支付宝的合法请求!");
			return "fail";
		}
		// 验证通知是否有效
		boolean checkedTrustiness = checkedTrustiness(request);
		if (!checkedTrustiness) {
			logger.error("支付宝请求异常!");
			return "fail";
		}
		if ("TRADE_FINISHED".equals(trade_status) || "TRADE_SUCCESS".equals(trade_status)) {//TRADE_FINISHED交易成功并结束
			......
		} /*else if (trade_status.equals("TRADE_SUCCESS")) {
			// 判断该笔订单是否在商户网站中已经做过处理
			// 如果没有做过处理,根据订单号(out_trade_no)在商户网站的订单系统中查到该笔订单的详细,并执行商户的业务程序
			// 如果有做过处理,不执行商户的业务程序

			// 注意:
			// 付款完成后,支付宝系统发送该交易状态通知
		}*/

		 return "fail";
		
	}

	/**
	 * 验证是否为支付宝的合法请求 --验证签名
	 * @param request  获取到的请求
	 * @return
	 */
	private boolean checkRSA(HttpServletRequest request) {
		Map<String, String> params = new HashMap<String, String>();
		Map<String, String[]> requestParams = request.getParameterMap();
		for (Iterator<String> iter = requestParams.keySet().iterator(); iter.hasNext();) {
			String name = (String) iter.next();
			String[] values = (String[]) requestParams.get(name);
			String valueStr = "";
			for (int i = 0; i < values.length; i++) {
				valueStr = (i == values.length - 1) ? valueStr + values[i]
						: valueStr + values[i] + ",";
			}
			// 乱码解决,这段代码在出现乱码时使用
			/*
			 * try {
			 * valueStr = new String(valueStr.getBytes("ISO-8859-1"), "utf-8");
			 * } catch (UnsupportedEncodingException e) {
			 * logger.error("回调接收参数乱码",e);
			 * }
			 */
			params.put(name, valueStr);
		}
		logger.info("收到支付宝异步回调:");
		logger.info(params.toString());
		boolean signVerified = false;
		// 调用SDK验证签名
		try {
			signVerified = AlipaySignature.rsaCheckV1(params, AlipayConfig.alipay_public_key, AlipayConfig.charset,
					AlipayConfig.sign_type);
			return signVerified;
		} catch (AlipayApiException e) {
			// 调试用,写文本函数记录程序运行情况是否正常
			String sWord = AlipaySignature.getSignCheckContentV1(params);
			AlipayConfig.logResult(sWord);
			logger.error("支付宝回调验证签名异常", e);
			return signVerified;
		}

	}

	// 验证支付
	private boolean checkedTrustiness(HttpServletRequest request) {
		// 验证成功
		String out_trade_no = "";
		String trade_status = "";
		String seller_id = "";
		String app_id = "";
		BigDecimal total_amount;
		try {
			// 商户订单号
			out_trade_no = new String(request.getParameter("out_trade_no").getBytes("ISO-8859-1"), "UTF-8");

			// 支付宝交易号
			// trade_no = new
			// String(request.getParameter("trade_no").getBytes("ISO-8859-1"),
			// "UTF-8");
			
			// 交易状态
			trade_status = new String(request.getParameter("trade_status").getBytes("ISO-8859-1"), "UTF-8");
			// 支付订单金额
			total_amount = new BigDecimal(
					new String(request.getParameter("buyer_pay_amount").getBytes("ISO-8859-1"), "UTF-8"));
			// 卖家支付宝账号
			seller_id = new String(request.getParameter("seller_id").getBytes("ISO-8859-1"), "UTF-8");
			app_id = new String(request.getParameter("app_id").getBytes("ISO-8859-1"), "UTF-8");

		} catch (UnsupportedEncodingException e) {
			logger.error("回调参数格式转换异常(payid=" + out_trade_no + ")", e);
			return false;
		}
		if (!"TRADE_FINISHED".equals(trade_status) && !"TRADE_SUCCESS".equals(trade_status)) {
			logger.error("支付宝返回的交易状态不正确(payid=" + out_trade_no + ")");
			return false;
		}
		// 2.验证out_trade_no是否正确
		PayBill bill = new PayBill();
		try {
			bill = payService.find(out_trade_no).get(0);
		} catch (PayWebOSException e) {
			logger.error("paybill 查询订单情况异常 (payid=" + out_trade_no + ")", e);
			return false;
		}
		// 3.判断totalamount
		if (!total_amount.equals(bill.getAmount()) ) {
			logger.error("支付宝返回的订单金额不正确(payid=" + out_trade_no + ")");
			return false;
		}
		// 支付状态是否正确
		if (PaySta.Success.equals(bill.getStatus())) {
			logger.error("订单状态不正确(payid=" + out_trade_no + ")");
			return false;
		}
		// 判断 seller_id
		if (!AlipayConfig.seller_id.equals(seller_id)) {
			logger.error("支付宝返回的seller_id不正确(payid=" + out_trade_no + ")");
			return false;
		}
		// 5.验证app_id
		if (!AlipayConfig.app_id.equals(app_id)) {
			logger.error("支付宝返回的app_id不正确(payid=" + out_trade_no + ")");
			return false;
		}
		return true;

	}

}
posted @ 2018-04-11 18:03  菜鸟心晴  阅读(1937)  评论(0编辑  收藏  举报