支付宝支付

来源:互联网 发布:淘宝网1岁以上儿童玩具 编辑:程序博客网 时间:2024/05/19 07:24

处理支付宝请求:

/** * 处理支付宝请求 *  * @param tradeNo * @param amt * @param request * @return * @throws IOException */private Map<String, String> dealAliPay(String tradeNo, Double amt) throws IOException {Map<String, String> url = new HashMap<String, String>();String orderInfo = AlipayCore.getOrderInfo(tradeNo, "APP充值", "用于APP充值", amt.toString());String sign = AlipayCore.sign(orderInfo, AlipayConfig.private_key);// 仅需对sign 做URL编码sign = URLEncoder.encode(sign, "UTF-8");String linkString = orderInfo + "&sign=\"" + sign + "\"&" + AlipayCore.getSignType();url.put("url", linkString);return url;}

封装订单信息:

/** * create the order info. 创建订单信息 *  @see http://doc.open.alipay.com/doc2/detail?treeId=59&articleId=103663&docType=1 */public static String getOrderInfo(String orderNo, String subject, String body, String price) {StringBuffer orderInfo = new StringBuffer();// 合作者身份IDorderInfo.append("partner=" + "\"" + AlipayConfig.partner + "\"");// 卖家支付宝账号orderInfo.append("&seller_id=" + "\"" + AlipayConfig.seller + "\"");// 商户网站唯一订单号 String(64)orderInfo.append("&out_trade_no=" + "\"" + orderNo + "\"");// 商品名称orderInfo.append("&subject=" + "\"" + subject + "\"");// 商品详情orderInfo.append("&body=" + "\"" + body + "\"");// 商品金额orderInfo.append("&total_fee=" + "\"" + price + "\"");// 服务器异步通知页面路径orderInfo.append("¬ify_url=" + "\"");//orderInfo.append(PropertiesUtil.getValue("ali.notify_url")).append("\"");orderInfo.append(PropertiesBean.alinotifyurl).append("\"");// 接口名称, 固定值orderInfo.append("&service=\"mobile.securitypay.pay\"");// 支付类型, 固定值orderInfo.append("&payment_type=\"1\"");// 参数编码, 固定值orderInfo.append("&_input_charset=\"utf-8\"");// 设置未付款交易的超时时间// 默认30分钟,一旦超时,该笔交易就会自动被关闭。// 取值范围:1m~15d。// m-分钟,h-小时,d-天,1c-当天(无论交易何时创建,都在0点关闭)。// 该参数数值不接受小数点,如1.5h,可转换为90m。orderInfo.append("&it_b_pay=\"1d\"");// 支付宝处理完请求后,当前页面跳转到商户指定页面的路径,可空orderInfo.append("&return_url=\"");//orderInfo.append(PropertiesUtil.getValue("ali.return_url")).append("\"");orderInfo.append(PropertiesBean.alireturnurl).append("\"");// 调用银行卡支付,需配置此参数,参与签名, 固定值// orderInfo .append("&paymethod=\"expressGateway\"");return orderInfo.toString();}

签名函数:

public static String sign(String content, String privateKey) {try {PKCS8EncodedKeySpec priPKCS8 = new PKCS8EncodedKeySpec(Base64.decode(privateKey));KeyFactory keyf = KeyFactory.getInstance(AlipayConfig.sign_type);PrivateKey priKey = keyf.generatePrivate(priPKCS8);java.security.Signature signature = java.security.Signature.getInstance(AlipayConfig.SIGN_ALGORITHMS);signature.initSign(priKey);signature.update(content.getBytes(AlipayConfig.input_charset));byte[] signed = signature.sign();return Base64.encode(signed);} catch (Exception e) {e.printStackTrace();}return null;}

处理交易结果通知:

/** * 支付宝支付返回消息验证 *  * @param request * @param response * @return */@RequestMapping("/al/payNotify")@ResponseBodypublic void alPayNotify(HttpServletRequest request, HttpServletResponse response) {// 获取支付宝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);}OutputStream out = null;try {out = response.getOutputStream();if (AlipayNotify.verify(params)) {// 验证成功// 请在这里加上商户的业务逻辑程序代码// 交易状态String trade_status = new String(request.getParameter("trade_status").getBytes("ISO-8859-1"), "UTF-8");// 交易状态TRADE_FINISHED的通知触发条件是商户签约的产品不支持退款功能的前提下,买家付款成功;// 或者,商户签约的产品支持退款功能的前提下,交易已经成功并且已经超过可退款期限;if (trade_status.equals("TRADE_FINISHED") || trade_status.equals("TRADE_SUCCESS")) {// 封装获取的结果AliPayNotifyDto dto = buildAliPayNotifyDto(request);boolean res = dealPayResult(dto.getOut_trade_no(),Double.valueOf(dto.getTotal_fee() * 100).intValue(), dto);if (res) {out.write("success".getBytes("UTF-8")); // 请不要修改或删除out.flush();logger.info("支付成功,{}", dto.toString());} else {// 不回复logger.error("系统处理支付宝消息失败,{}", dto.toString());}}} else {// 验证失败out.write("fail".getBytes("UTF-8")); // 请不要修改或删除out.flush();}} catch (UnsupportedEncodingException e) {logger.error("回复易宝支付消息失败", e);} catch (IOException e) {logger.error("回复易宝支付消息失败", e);} catch (ParseException e) {logger.error("转换消息失败", e);}}


0 0