起步软件技术论坛
搜索
 找回密码
 注册

QQ登录

只需一步,快速开始

查看: 1954|回复: 4

[处理中1] 支付宝(notifyUrl)异步回调

[复制链接]

93

主题

570

帖子

1411

积分

金牌会员

Rank: 6Rank: 6

积分
1411
QQ
发表于 2016-10-13 11:00:23 | 显示全部楼层 |阅读模式
不知道管理能否提供一份支付宝(notifyUrl)异步回调的java代码,目前案例只有微信(notifyUrl)异步回调的,这两天都在看网上的相关资源都没能写出来

93

主题

570

帖子

1411

积分

金牌会员

Rank: 6Rank: 6

积分
1411
QQ
 楼主| 发表于 2016-10-13 11:52:03 | 显示全部楼层
  1. package wechat;
  2. import java.io.BufferedReader;
  3. import java.io.InputStreamReader;
  4. import java.net.HttpURLConnection;
  5. import java.net.URL;
  6. import java.util.Map;

  7. import com.alipay.api.AlipayApiException;
  8. import com.alipay.api.internal.util.AlipaySignature;
  9. import wechat.AlipayServiceEnvConstants;




  10.         public class ZfbPayNotify {  
  11.           
  12.                 /**
  13.              * 支付宝消息验证地址
  14.              */
  15.             private static final String HTTPS_VERIFY_URL = "https://mapi.alipay.com/gateway.do?service=notify_verify&";

  16.             /**
  17.              * 验证消息是否是支付宝发出的合法消息
  18.              * @param params 通知返回来的参数数组
  19.              * @return 验证结果
  20.              */
  21.             public static boolean verify(Map<String, String> params) {

  22.                 //判断responsetTxt是否为true,isSign是否为true
  23.                 //responsetTxt的结果不是true,与服务器设置问题、合作身份者ID、notify_id一分钟失效有关
  24.                 //isSign不是true,与安全校验码、请求时的参数格式(如:带自定义参数等)、编码格式有关
  25.                     String responseTxt = "true";
  26.                         if(params.get("notify_id") != null) {
  27.                                 String notify_id = params.get("notify_id");
  28.                                 responseTxt = verifyResponse(notify_id);
  29.                         }
  30.                     String sign = "";
  31.                     if(params.get("sign") != null) {sign = params.get("sign");}
  32.                     boolean isSign = getRSASignVerify(params, sign);

  33.                 //写日志记录(若要调试,请取消下面两行注释)
  34.                 String sWord = "responseTxt=" + responseTxt + "\n isSign=" + isSign + "\n 返回回来的参数:" + AlipayCore.createLinkString(params);
  35.                     AlipayCore.logResult(sWord);

  36.                 if (isSign && responseTxt.equals("true")) {
  37.                     return true;
  38.                 } else {
  39.                     return false;
  40.                 }
  41.             }

  42.             /**
  43.              * 根据反馈回来的信息,生成签名结果
  44.              * @param Params 通知返回来的参数数组
  45.              * @param sign 比对的签名结果
  46.              * @return 生成的签名结果
  47.              */
  48.                 private static boolean getRSASignVerify(Map<String, String> Params, String sign) {
  49.                     //过滤空值、sign与sign_type参数
  50.                     Map<String, String> sParaNew = AlipayCore.paraFilter(Params);
  51.                 //获取待签名字符串
  52.                 String preSignStr = AlipayCore.createLinkString(sParaNew);
  53.                 //获得签名验证结果
  54.                 boolean isSign = false;
  55.                 try {
  56.                                 isSign = AlipaySignature.rsaCheckContent(
  57.                                                 preSignStr, sign, AlipayServiceEnvConstants.ALIPAY_PUBLIC_KEY,
  58.                                                 AlipayServiceEnvConstants.CHARSET);
  59.                         } catch (AlipayApiException e) {
  60.                                 // TODO Auto-generated catch block
  61.                                 e.printStackTrace();
  62.                         }
  63.                 
  64.                 return isSign;
  65.             }

  66.             /**
  67.             * 获取远程服务器ATN结果,验证返回URL
  68.             * @param notify_id 通知校验ID
  69.             * @return 服务器ATN结果
  70.             * 验证结果集:
  71.             * invalid命令参数不对 出现这个错误,请检测返回处理中partner和key是否为空
  72.             * true 返回正确信息
  73.             * false 请检查防火墙或者是服务器阻止端口问题以及验证时间是否超过一分钟
  74.             */
  75.             private static String verifyResponse(String notify_id) {
  76.                 //获取远程服务器ATN结果,验证是否是支付宝服务器发来的请求

  77.                 String partner = AlipayServiceEnvConstants.PARTNER;
  78.                 String veryfy_url = HTTPS_VERIFY_URL + "partner=" + partner + "&notify_id=" + notify_id;

  79.                 return checkUrl(veryfy_url);
  80.             }

  81.             /**
  82.             * 获取远程服务器ATN结果
  83.             * @param urlvalue 指定URL路径地址
  84.             * @return 服务器ATN结果
  85.             * 验证结果集:
  86.             * invalid命令参数不对 出现这个错误,请检测返回处理中partner和key是否为空
  87.             * true 返回正确信息
  88.             * false 请检查防火墙或者是服务器阻止端口问题以及验证时间是否超过一分钟
  89.             */
  90.             private static String checkUrl(String urlvalue) {
  91.                 String inputLine = "";

  92.                 try {
  93.                     URL url = new URL(urlvalue);
  94.                     HttpURLConnection urlConnection = (HttpURLConnection) url.openConnection();
  95.                     BufferedReader in = new BufferedReader(new InputStreamReader(urlConnection
  96.                         .getInputStream()));
  97.                     inputLine = in.readLine().toString();
  98.                 } catch (Exception e) {
  99.                     e.printStackTrace();
  100.                     inputLine = "";
  101.                 }

  102.                 return inputLine;
  103.             }
  104.        
  105. }  
复制代码
qq:7953899
回复 支持 反对

使用道具 举报

93

主题

570

帖子

1411

积分

金牌会员

Rank: 6Rank: 6

积分
1411
QQ
 楼主| 发表于 2016-10-13 11:52:50 | 显示全部楼层
看了下官方的demo,就是以上代码,不知道能不能直接用?
qq:7953899
回复 支持 反对

使用道具 举报

1

主题

3232

帖子

1174

积分

金牌会员

Rank: 6Rank: 6

积分
1174
QQ
发表于 2016-10-13 14:17:38 | 显示全部楼层
不羁的风 发表于 2016-10-13 11:52
看了下官方的demo,就是以上代码,不知道能不能直接用?

是可以直接用的,代码就是这些,就是要注意,把信息改成自己的,调用发放就是以上代码的方法,然后就是注意参数的问题,

具体可以参考文档:http://docs.wex5.com/pay-alipay-step-by-step/
在问题解决后,希望大家可以吧解决方法也分享一下,这样可以让更多的X5开发者共同进步,谢谢大家的知识共享
回复 支持 反对

使用道具 举报

93

主题

570

帖子

1411

积分

金牌会员

Rank: 6Rank: 6

积分
1411
QQ
 楼主| 发表于 2016-10-13 14:32:46 | 显示全部楼层
闰土 发表于 2016-10-13 14:17
是可以直接用的,代码就是这些,就是要注意,把信息改成自己的,调用发放就是以上代码的方法,然后就是注 ...

不知道能不能QQ协助一下 我在努力调试 遇到了问题  QQ私信您了
qq:7953899
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

小黑屋|手机版|X3技术论坛|Justep Inc.    

GMT+8, 2025-6-19 09:42 , Processed in 0.071454 second(s), 23 queries .

Powered by Discuz! X3.4

© 2001-2013 Comsenz Inc.

快速回复 返回顶部 返回列表