支付宝支付

公司产品需要做支付功能,集成了支付宝支付和微信支付,现在讲一下支付宝支付。
支付宝支付
这是支付宝支付的总流程,我是做java后端的,因此只需要做两件事,提供支付宝签名和处理异步通知结果。
支付宝签名:

添加依赖

<!--支付宝支付所用压缩包-->
        <dependency>
            <groupId>com.alipay</groupId>
            <artifactId>alipay-sdk-java</artifactId>
            <version>1.0</version>
        </dependency>
/**
*生成支付宝签名
*/
public String buildPaySign(double amount, String enterpriseId) throws Exception {
        String orderId = UUIDHelper.getOrderNo();//生成订单id
        Date current = new Date();
        Map<String, String> map = buildPayMap(amount, orderId, current);//创建支付参数信息
        String paramsStr = MapConmon.mapSort(map);//支付参数信息根据key排序拼接成字符串
        String sign = sign(paramsStr);//加签获取sign
        String encodedSign = "";
        try {
            encodedSign = URLEncoder.encode(sign, CHARSET);
        } catch (UnsupportedEncodingException e) {
            e.printStackTrace();
        }
        paramsStr = buildParam(map);//支付参数信息
        orderDao.insertOrder(orderId, amount, enterpriseId, current);//插入订单

        return paramsStr + "sign=" + encodedSign;//返回签名

    }

/**
*构建支付信息
*/
private Map<String, String> buildPayMap(double amount, String orderId, Date date) throws Exception {
        Map<String, String> keyValues = new HashMap<String, String>();
        keyValues.put("app_id", APPID2);
        keyValues.put("biz_content", "{\"timeout_express\":\"90m\",\"product_code\":\"QUICK_MSECURITY_PAY\"," +
                "\"total_amount\":\"" + amount + "\",\"subject\":\"充值\",\"body\":\"充值\",\"out_trade_no\":\"" + orderId +
                "\"}");

        keyValues.put("charset", "utf-8");

        keyValues.put("method", "alipay.trade.app.pay");

        keyValues.put("sign_type", "RSA2");

        keyValues.put("timestamp", TypeConvert.DateToString(date));

        keyValues.put("version", "1.0");

        keyValues.put("notify_url", NOTIFY_URL);

        return keyValues;
    }


/**
*排序后拼接
*/
public String mapSort( Map<String, String> map){
        List<String> keys = new ArrayList<String>(map.keySet());
        // key排序
        Collections.sort(keys);
        StringBuilder params = new StringBuilder();
        for (int i = 0; i < keys.size(); i++) {
            String key = keys.get(i);
            if(!key.equals("sign")) {
                String value = map.get(key);
                params.append(buildKeyValue(key, value, false));
                params.append("&");
            }
        }
        String paramsStr = params.substring(0, params.length() - 1);
        return paramsStr;
    }

/**
*加签
*/
public String sign(String content) throws Exception {
        String sign = AlipaySignature.rsaSign(content, privateKey, CHARSET, SIGN_TYPE);
        return sign;
    }

/**
     * 构造支付订单参数信息
     *
     * @param map 支付订单参数
     * @return
     */
    private String buildParam(Map<String, String> map) {
        List<String> keys = new ArrayList<String>(map.keySet());

        StringBuilder sb = new StringBuilder();
        for (int i = 0; i < keys.size(); i++) {
            String key = keys.get(i);
            String value = map.get(key);
            sb.append(MapConmon.buildKeyValue(key, value, true));
            sb.append("&");
        }

        return sb.toString();
    }

异步接收支付宝返回的通知信息

 @ApiOperation(value = "保存支付宝异步充值成功信息")
    @RequestMapping(value = "/alipay", method = RequestMethod.POST, produces = {MediaType.APPLICATION_JSON_VALUE})
    public String saveAliPayInfo(HttpServletRequest request) {
        LogHelper.warn("alipay异步通知开始------------------------------------------");
        String result = "success";
        String failResult = "failed";
        try {
            Map<String, String[]> map = request.getParameterMap();
            Map<String, String> resultMap = MapConmon.mapConvert(map);
            if (map == null || !resultMap.containsKey("trade_status") || (!resultMap.get("trade_status").equals
                    ("TRADE_SUCCESS")&&!resultMap.get("trade_status").equals ("TRADE_FINISHED")))
                return failResult;

            if(!alipay.verifySign(resultMap))//验证签名
                return failResult;

			//支付成功后的业务,根据自己实际来写
            String userId = resultMap.get("buyer_id");
            double amount = Double.parseDouble(resultMap.get("total_amount"));
            PayInfo info =PayInfo.getInstance(userId,"支付宝充值",amount, ConstantUtil.ALIPAY,resultMap.get
                    ("out_trade_no"),resultMap.get("trade_no"),userId,resultMap.get("app_id"));//支付宝充值信息

            String msg = transferDao.savePayInfo(info);//插入支付相关信息
            if (!msg.equals("充值成功"))
                result = failResult;

        } catch (Exception e) {
            result = failResult;
            e.printStackTrace();
        }
        LogHelper.warn("alipay异步通知结束------------------------------------------");
        return result;
    }

/**
*验证签名
*/
public boolean verifySign(Map<String, String> map) throws Exception {
        if (!map.containsKey("sign") || !map.containsKey("sign_type")) {
            return false;
        }
        boolean signVerified = AlipaySignature.rsaCheckV1(map, publicKey, CHARSET, SIGN_TYPE); //调用SDK验证签名
        LogHelper.warn("signVerified=" + signVerified);
        return signVerified;
    }

以上就是支付宝支付后台需要做的功能。