这个支付的流程是前端H5(APP等)需要支付时调用后台的接口拿到我们加密的签名去调起支付宝的支付界面(支付宝APP)进行支付操作,并且前端在支付成功后,支付宝后台会回调一个我们在签名时写入的一个接口地址进行支付结果的异步通知。

前置准备

  • 1、在整个编写过程中使用到的变量主要有私钥、公钥以及你的APPID(H5支付不需要),这些都是你在蚂蚁金服注册之后拿到的。
  • 2、使用到的jar包:

    • alipay-sdk-java*.jar—————————支付宝SDK编译文件jar
    • alipay-sdk-java*-source.jar——————支付宝SDK源码文件jar
    • commons-logging-1.1.1.jar——————SDK依赖的日志jar
    • commons-logging-1.1.1-sources.jar———SDK依赖的日志源码jar

      支付宝的SDK的jar包没有在maven repository里注册,因此要自己去官网上下载生成jar包并打进maven仓库里,懒得写的同学可以点击这里直接下载。

代码

获取签名的接口

@ResponseBody
@RequestMapping(value="/alipaySign",method=RequestMethod.POST)
public JSONObject signprams(Double totalAmount,String userId,String out_trade_no){
String subject = "Your Subject"; //主题
String body = "Your Body"; //主题内容
String CHARSET = "utf-8"; /**
* 实例化客户端
*/
AlipayClient alipayClient = new DefaultAlipayClient
(PayConstants.Ali_Open_Api_Domain,PayConstants.Ali_AppId,
PayConstants.ALI_PRIVATE_KEY,"json",CHARSET,PayConstants.ALI_PUBLIC_KEY,"RSA2");
//实例化具体API对应的request类,类名称和接口名称对应
AlipayTradeAppPayRequest alirequest = new AlipayTradeAppPayRequest();
//sdk中的model入参
AlipayTradeAppPayModel model = new AlipayTradeAppPayModel();
model.setPassbackParams(body); //描述信息,添加附加数据
model.setSubject(subject); //商品标题
model.setOutTradeNo(out_trade_no); //订单号
model.setTimeoutExpress("30m"); //超时关闭该订单时间
model.setTotalAmount(Double.toString(totalAmount)); //将double数值转换成String类
model.setProductCode(PayConstants.Ali_ProductCode);
alirequest.setBizModel(model);
alirequest.setNotifyUrl(PayConstants.Ali_Notify_Url); //回调地址 String orderStr = "";
try {
AlipayTradeAppPayResponse response = alipayClient.sdkExecute(alirequest);
orderStr = response.getBody();
} catch (AlipayApiException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} String sign = DigestUtils.md5Hex(out_trade_no).toUpperCase(); /////////////////处理你自己的逻辑///////////////////////// JSONObject resObj = new JSONObject();
resObj.put("code", "SUCCESS");
resObj.put("out_trade_no", out_trade_no);
resObj.put("sign", sign);
resObj.put("orderStr",orderStr);
System.out.println(resObj.toJSONString());
System.out.println(resObj.toString());
return resObj;
}

回调的接口

回调的地址一定要保证是外网的地址,内网开发地址因为防火墙的限制不一定能访问到。

@ResponseBody
@RequestMapping(value="/alipayNotify",method=RequestMethod.POST)
public String getNotify(HttpServletRequest request){
Map requestParams = request.getParameterMap();
logger.info("支付宝支付结果通知:"+requestParams.toString());
//获取支付宝POST过来反馈信息
Map<String,String> params = new HashMap<String,String>(); 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] + ",";
logger.info(valueStr);
//乱码解决,这段代码在出现乱码时使用。
//valueStr = new String(valueStr.getBytes("ISO-8859-1"), "utf-8");
params.put(name, valueStr);
}
} ///////////////////处理自己的逻辑////////////////////// try {
boolean flag = AlipaySignature.rsaCheckV1
(params, PayConstants.ALI_PUBLIC_KEY, "UTF-8", "RSA2");
if(flag){
if("TRADE_SUCCESS".equals(params.get("trade_status"))) }
} catch (AlipayApiException e) {
e.printStackTrace();
}
return "SUCCESS";
}

最新文章

  1. 【HOW】如何手工编辑InfoPath文件
  2. android -- 之PopupWindow的使用
  3. [转发] 老叶观点:MySQL开发规范之我见
  4. 10个 iOS 用户暂可以嘲笑 Android 的特点
  5. C++:delete和delete[]释放内存的区别
  6. Windows Message Codes
  7. C# XmlSerializer序列化浅析
  8. Python实现合并排序MergeSort
  9. 将 子集和问题 运行时间从 200.8s 优化到 0.4s
  10. Windows Azure 上 Linux VM 中的交换空间 – 第 2 部分
  11. Java网络编程注意事项3
  12. web.xml文件中的7个错误的安全配置
  13. 关于QT中的音频通信问题
  14. php java aes
  15. ABP Changing Httpcode status
  16. Nsis Sqlite Plugin
  17. Mongodb 3.4 Replication
  18. linux 虚拟机 安装 php-7.0.2
  19. Powershell(2)
  20. 什么是IIS并发连接数

热门文章

  1. 如何在IDEA中创建web项目并且部署到Tomcat中
  2. shell 脚本去掉月份和天数的前导零
  3. SSH之IDEA2017整合Struts2+Spring+Hibernate
  4. 分享一下vue ui的分页的用法
  5. TwinCAT 3中基于UDP协议通讯的C++实现
  6. Node测试文章收藏
  7. 使用scatter画散点图
  8. 安装成功的nginx,如何添加未编译安装模块(非覆盖安装http_image_filter_module)
  9. CSUOJ 1651 Weirdo
  10. Zookeeper vs. etcd