支付宝支付相关代码

说明:
product_code参数为销售产品码,与支付宝签约的产品码名称,此参数一般为必填参数,请严格按照开放平台文档要求传递

示例:
1.电脑网站支付产品alipay.trade.page.pay接口中,product_code为:FAST_INSTANT_TRADE_PAY
2.手机网站支付产品alipay.trade.wap.pay接口中,product_code为:QUICK_WAP_WAY
3.当面付条码支付产品alipay.trade.pay接口中,product_code为:FACE_TO_FACE_PAYMENT
4.APP支付产品alipay.trade.app.pay接口中,product_code为:QUICK_MSECURITY_PAY

注意点:
1.product_code参数不得为空
2. product_code不得传错

private AlipayClient alipayClient;
    AlipayClient getAlipayClient(){
        if(alipayClient == null){
            alipayClient = new DefaultAlipayClient(ProjectConsts.ALI_PAY_URL,
                    appId, rsaPrivateKey, ProjectConsts.aliFormat, ProjectConsts.aliCharset, rsaPublicKey, ProjectConsts.aliSignType); //获得初始化的AlipayClient
        }
        return alipayClient;
    }
 /**
     * 支付宝支付
     */


    public void aliPrepay(HttpServletResponse response) {
        try{
            String form = generateAliPay();
            if(!"err".equals(form)){
                response.setContentType("text/html;charset=utf-8");
                response.getWriter().write(form);// 直接将完整的表单html输出到页面
                response.getWriter().flush();
            }
        }catch (Exception e){
            System.out.println("支付失败");
        }
    }
 /**
     * 支付宝方面订单号获取
     */
    public String generateAliPay(){
        AlipayClient alipayClient = getAlipayClient();
        AlipayTradeWapPayRequest alipayRequest = new AlipayTradeWapPayRequest();


        // 封装请求支付信息
        AlipayTradeWapPayModel model = new AlipayTradeWapPayModel();
        model.setOutTradeNo("1");//本地订单号
        model.setSubject("黑人牙膏");//订单标题
        Integer totalAmount = 10;//订单总金额(单位元精确小数后两位)
        model.setTotalAmount(String.valueOf(totalAmount));
        model.setBody("好用");//产品描述
        model.setProductCode("QUICK_WAP_WAY");//销售产品码
        alipayRequest.setBizModel(model);
        // 设置异步通知地址
        alipayRequest.setNotifyUrl("https://tronsis.test.com/demo/com/ali/pay");
        // 设置同步地址
        alipayRequest.setReturnUrl("https://tronsis.test.com");


        String form = "";
        try {
//            logger.info("alipay_request = "+ TJson.objToStr(alipayRequest));
            // 调用SDK生成表单
            form = alipayClient.pageExecute(alipayRequest).getBody();//调用SDK生成表单
//            logger.info("form = "+form);
        } catch (Exception e) {
            System.out.println("支付出错");
        }
        return form;
    }

 /**
     * 支付宝方面异步回调
     * @param request
     * @return
     */
    public String AlipayCallBack(HttpServletRequest request){
        //获取支付宝POST过来反馈信息
        Map<String,String> params = new HashMap<String,String>();


        Map requestParams = request.getParameterMap();
        for (Iterator 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] + ",";
            }
            //乱码解决,这段代码在出现乱码时使用。如果mysign和sign不相等也可以使用这段代码转化
            //valueStr = new String(valueStr.getBytes("ISO-8859-1"), "gbk");
            params.put(name, valueStr);
        }
        logger.info("params = "+ TJson.objToStr(params));
        boolean verify_result =  rsaCheck(params);
        if(verify_result && dealWithAliPayChargeOrder(params)){
            return "success";
        }
        return "false";
    }

 /**
     * 订单验证
     * @param params
     * @return
     */
    @Transactional
    public boolean dealWithAliPayChargeOrder(Map<String, String> params) {
        String outTradeNo = params.get("out_trade_no");
        Order order = orderMapper.selectByOutTradeNo(outTradeNo);
        if (order == null) {
            logger.info("订单" + outTradeNo + "不存在");
            return false;
        }


        boolean locked = distributeLocker.lock(ProjectConsts.USER_ALIPAY_DEAL_LOCK_KEY);
        try {
            if (locked) {
                String totalAmount = params.get("total_amount");
                double totalPrice = Double.parseDouble(totalAmount) * 100;
                if(order.getTotalAmount() != Math.round(totalPrice)){
                    logger.info("alipay和订单金额不一致");
                    return false;
                }


                if(totalPrice < 0 || order.getTotalAmount() < 0){
                    logger.info("alipay或订单金额为负");
                    return false;
                }
                //set done
                order.setCreatOn(LocalDateTime.now());
                order.setUpdateOn(LocalDateTime.now());
                order.setStatus(ClientOrderStatus.PAYED);


                //后台订单状态初始化为 等待接待
                order.setServiceStatus(ServiceStatus.SERVICE_WAIT);
                libraOrderRepository.save(order);
            }
        } finally {
            if (locked) {
                //TODO  + order.getUserId()
                distributeLocker.unlock(ProjectConsts.USER_ALIPAY_DEAL_LOCK_KEY);
            }
        }
        return false;
    }


 /**
     * 验证RSA签名
     * @param params
     * @return
     */
    public boolean rsaCheck(Map<String, String> params) {
        try {
            boolean verify_result = AlipaySignature.rsaCheckV1(params, rsaPublicKey, "utf-8", "RSA2");
            logger.info("verify_result = " + verify_result);
            return verify_result;
        } catch (AlipayApiException e) {
            System.out.println("验证签名失败");
            throw CommonException.PAY_FAIL;
        }
    }

猜你喜欢

转载自blog.csdn.net/weixin_44100313/article/details/86094592