支付宝的API

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<%@ page import="java.util.*"%>
<%@ page import="com.alipay.util.*"%>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>
</title>
</head>
<body>
<%
			String partner = ""; //partner合作伙伴id(必须填写)
			String privateKey = ""; //partner 的对应交易安全校验码(必须填写)
//**********************************************************************************
//如果您服务器不支持https交互,可以使用http的验证查询地址		
			//String alipayNotifyURL = "https://www.alipay.com/cooperate/gateway.do?service=notify_verify"
		    String alipayNotifyURL = "http://notify.alipay.com/trade/notify_query.do?"
					+ "partner="
					+ partner
					+ "&notify_id="
					+ request.getParameter("notify_id");
			String sign=request.getParameter("sign");
			//获取支付宝ATN返回结果,true是正确的订单信息,false 是无效的
			String responseTxt = CheckURL.check(alipayNotifyURL);
 
			Map params = new HashMap();
			//获得POST 过来参数设置到新的params中
			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] + ",";		
				}
				params.put(name, valueStr);
		}
 
			String mysign = com.alipay.util.SignatureHelper_return.sign(params, privateKey);
 
			//打印,收到消息比对sign的计算结果和传递来的sign是否匹配
			//out.println(mysign+"--------------------"+sign);
			if (mysign.equals(request.getParameter("sign")) && responseTxt.equals("true") ){
 
				out.println("交易成功");
			}
				else
			{
				out.println("交易失败");
			}		
		%>
</body>
</html>

根据源码可以看出,支付失败无非就是responseTxt不为true或mysign与支付宝返回的sign不一致。将这几个参数打印出来之后,发现在支付宝那里成功支付后,这里的responseTxt是为true的,而mysign与sign值却不同。
从支付宝提供的文档中可以知道,sign是商城提交相关参数给支付宝,在支付宝那边根据参数生的MD5,支付成功后,支付宝会将商城提交的参数及其计算的sign值一并返回,而商城这边再根据这些参数生成一个MD5值mysign,通过比对这两个值以判断是否签名成功。
加密前的参数应该也都是一致的,怎么加密得到的结果不一样呢,后来想一想,同样值的字符串,以不同编码方式进行MD5加密得到的结果也不同。在提交数据给支付宝时有一个_input_charset参数,用于指定所采用的编码方式,我这里用的是UTF-8,而发现支付宝提供的UTF-8版的DEMO中的过滤器却将字符编码都转成了GBK,晕倒…可是改成UTF-8后问题依旧,难道过滤器没有对支付宝传递过来的参数起作用?于是修改alipay_return.jsp文件,在params.put(name, valueStr)之前加了valueStr = new String(valueStr.getBytes(“iso8859-1″),”utf-8″)。问题解决!

评论 2 您还未登录,请先 登录 后发表或查看评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
©️2022 CSDN 皮肤主题:大白 设计师:CSDN官方博客 返回首页

打赏作者

cutemouse

你的鼓励将是我创作的最大动力

¥2 ¥4 ¥6 ¥10 ¥20
输入1-500的整数
余额支付 (余额:-- )
扫码支付
扫码支付:¥2
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、C币套餐、付费专栏及课程。

余额充值