java 支付宝即时到帐提交订单dome
package com.tian.batis; import java.io.UnsupportedEncodingException;
import java.net.URLEncoder;
import java.util.ArrayList;
import java.util.Collections;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import org.apache.commons.codec.digest.DigestUtils;
import javax.servlet.http.HttpServletResponse; public class alipay {
/**
* alipay 支付接口
*
* @param _input_charset
* 编码
* @param subject
* 商品名 (必填)
* @param notify_url
* 异步执行地址
* @param body
* 商品描述
* @param payment_type
* 付款类型
* @param out_trade_no
* 订单号 (必填)
* @param partner
* 商家id
* @param service
* 服务
* @param total_fee
* 金额 (必填)
* @param return_url
* 返回展示地址
* @param sign_type
* 加密方式(默认md5)
* @param seller_id
* 同商家id
* @param response
* @param sessionId
* sessionId
* @return 成功 返回url;-1失败(参数);-2处理异常
*/
public String AlipayPayment(String _input_charset, String subject, String notify_url, String body,
String payment_type, String out_trade_no, String partner, String service, Integer total_fee,
String return_url, String sign_type, String seller_id, HttpServletResponse response, String sessionId) {
try {
String strSandbox = "https://mapi.alipay.com/gateway.do";// 地址
ConfigManager configManager = ConfigManager.getInstance("alipayconfig.properties"); Map<String, String> map = new HashMap<String, String>(); if (null != subject && subject.trim().length() > 0) {
map.put("subject", subject);
} else {
return "-1";
} if (null != out_trade_no && out_trade_no.trim().length() > 0) {
map.put("out_trade_no", out_trade_no);
} else {
return "-1";
} if (null != total_fee && total_fee > 0) {
map.put("total_fee", total_fee + "");
// map.put("total_fee", "0.01");
} else {
return "-1";
} if (null != _input_charset && _input_charset.trim().length() > 0) {
map.put("_input_charset", _input_charset);
} else {
map.put("_input_charset", configManager.getConfigItem("alipay._input_charset").toString());
} if (null != notify_url && notify_url.trim().length() > 0) {
map.put("notify_url", notify_url);
} else {
map.put("notify_url", configManager.getConfigItem("alipay.notify_url1").toString());
} if (null != return_url && return_url.trim().length() > 0) {
map.put("return_url", return_url);
} else {
map.put("return_url", configManager.getConfigItem("alipay.return_url").toString());
} if (null != payment_type && payment_type.trim().length() > 0) {
map.put("payment_type", payment_type);
} else {
map.put("payment_type", configManager.getConfigItem("alipay.payment_type").toString());
} if (null != partner && partner.trim().length() > 0) {
map.put("partner", partner);
} else {
map.put("partner", configManager.getConfigItem("alipay.partner").toString());
} if (null != service && service.trim().length() > 0) {
map.put("service", service);
} else {
map.put("service", configManager.getConfigItem("alipay.service").toString());
} if (null != sign_type && sign_type.trim().length() > 0) {
map.put("sign_type", sign_type);
} else {
map.put("sign_type", configManager.getConfigItem("alipay.sign_type").toString());
} if (null != seller_id && seller_id.trim().length() > 0) {
map.put("seller_id", seller_id);
} else {
map.put("seller_id", configManager.getConfigItem("alipay.seller_id").toString());
} if (null != body && body.trim().length() > 0) {
map.put("body", body);
} if (null != sessionId && sessionId.trim().length() > 0) {
map.put("extra_common_param", sessionId);
} Map<String, String> sPara = paraFilter(map);
// 生成签名结果
String sign = buildRequestMysign(sPara, configManager.getConfigItem("alipay.key").toString(),
configManager.getConfigItem("alipay._input_charset").toString());
map.put("sign", sign); String str = "";
for (Map.Entry<String, String> entry : map.entrySet()) {
String key = entry.getKey();
String value = entry.getValue();
if (key.equals("subject") || key.equals("body")) {
value = URLEncoder.encode(value, "UTF-8");
}
if (null != str && str.trim().length() > 0) {
str += "&" + key + "=" + value;
} else {
str += key + "=" + value;
}
} String url = strSandbox;
if (null != str && str.trim().length() > 0) {
url += "?" + str;
}
return url;
// 注:如果失败考虑
// 1.response 重定向编码
// 2.sign_type 放置参数末尾
// 3.url 追加 _input_charset=utf-8
} catch (Exception e) {
e.printStackTrace();
return "-2";
}
}
///////////////////////////////////////////////////////
/**
* 除去数组中的空值和签名参数
*
* @param sArray
* 签名参数组
* @return 去掉空值与签名参数后的新签名参数组
*/
public static Map<String, String> paraFilter(Map<String, String> sArray) {
Map<String, String> result = new HashMap<String, String>();
if (sArray == null || sArray.size() <= 0) {
return result;
}
for (String key : sArray.keySet()) {
String value = sArray.get(key);
if (value == null || value.equals("") || key.equalsIgnoreCase("sign")
|| key.equalsIgnoreCase("sign_type")) {
continue;
}
result.put(key, value);
}
return result;
} /**
* 生成签名结果
*
* @param sPara
* 要签名的数组
* @return 签名结果字符串
*/
public static String buildRequestMysign(Map<String, String> sPara, String key, String input_charset) {
String prestr = createLinkString(sPara); // 把数组所有元素,按照“参数=参数值”的模式用“&”字符拼接成字符串
String mysign = "";
mysign = sign(prestr, key, input_charset);
return mysign;
} /**
* 把数组所有元素排序,并按照“参数=参数值”的模式用“&”字符拼接成字符串
*
* @param params
* 需要排序并参与字符拼接的参数组
* @return 拼接后字符串
*/
public static String createLinkString(Map<String, String> params) {
List<String> keys = new ArrayList<String>(params.keySet());
Collections.sort(keys);
String prestr = "";
for (int i = 0; i < keys.size(); i++) {
String key = keys.get(i);
String value = params.get(key); if (i == keys.size() - 1) {// 拼接时,不包括最后一个&字符
prestr = prestr + key + "=" + value;
} else {
prestr = prestr + key + "=" + value + "&";
}
}
return prestr;
}
/**
* 签名字符串
*
* @param text
* 需要签名的字符串
* @param key
* 密钥
* @param input_charset
* 编码格式
* @return 签名结果
*/
public static String sign(String text, String key, String input_charset) {
text = text + key;
return DigestUtils.md5Hex(getContentBytes(text, input_charset));
} /**
* @param content
* @param charset
* @return
* @throws SignatureException
* @throws UnsupportedEncodingException
*/
private static byte[] getContentBytes(String content, String charset) {
if (charset == null || "".equals(charset)) {
return content.getBytes();
}
try {
return content.getBytes(charset);
} catch (UnsupportedEncodingException e) {
throw new RuntimeException("MD5签名过程中出现错误,指定的编码集不对,您目前指定的编码集是:" + charset);
}
}
}
java 支付宝即时到帐提交订单dome的更多相关文章
- ThinkPHP3.2对接开发支付宝即时到帐接口
ThinkPHP3.2对接开发支付宝即时到帐接口 在做一些商城.自动发卡网站.会员积分充值.金币充值等等这类网站都时候,我们极大可能需要使用到第三方都支付接口.不管是财付通.支付宝.银联.贝宝.易宝这 ...
- 支付宝即时到帐接口的python实现,演示样例採用django框架
因工作须要研究了支付宝即时到帐接口.并成功应用到站点上,把过程拿出来分享. 即时到帐仅仅是支付宝众多商家服务中的一个,表示客户付款,客户用支付宝付款.支付宝收到款项后,立即通知你,而且此笔款项与交易脱 ...
- 关于支付宝即时到帐异步通知(notify_url)一点总结
(1)首先做支付的商业网站,需要能够上网(支付成功后,需要进行参数回传验证,如果上不了网,responseText就直接为false)(2)notify_url这个不能进行验证,比如继承父类Page, ...
- 支付宝即时到账接口开发 - DEMO讲解
支付宝即时到帐接口 环境要求 PHP5.0以上,且需要开启curl.openssl. 文档地址: https://doc.open.alipay.com/doc2/detail?treeId=62&a ...
- 编写Java程序,模拟网上商城购物,当用户选好物品提交订单时,每笔订单会自动生成一个唯一的订单编号。
查看本章节 查看作业目录 需求说明: 模拟网上商城购物,当用户选好物品提交订单时,每笔订单会自动生成一个唯一的订单编号.而部分电子商务网站在数据高峰期时,一毫秒可能需要处理近千笔的订单 现在简单模拟 ...
- 实战 Spring MVC接入支付宝即时到账 (部分代码)
下面就拿我项目中的部分代码来实践一下. 支付请求 首先,是提交表单 fund.jsp(这里我表单只需要用户填交易金额,其他的订单号之类的全部后台生成) <form id="deposi ...
- thinkphp框架对接支付宝即时到账接口回调的代码
关于支付宝即时收款接口的对接过程,很简单,也有很多人发过,我这里就不在啰嗦了,对接完成后,在线支付成功后的回调,相对来说,是个难点,,我重点分享下我的经验. 我在开发二代旅游CMS(http://ww ...
- 支付宝即时到账DEMO配置与使用
支付宝网页即时到账功能,可让用户在线向开发者的支付宝账号支付资金,交易资金即时到账,帮助开发者快速回笼资金. 当用户进行支付操作时候可以直接跳转到支付宝支付页面进行支付 1. 准备 关于支付宝签约即时 ...
- java支付宝开发-02-手机网站支付
源码已上传github,欢迎专注:https://github.com/shirayner/alipay-wap 一.基础部分 1.手机网站支付产品介绍 1.1 阅读官方介绍: 手机网站支付产品介绍 ...
随机推荐
- 创建工程常量 (OC中的宏定义)
1.oc创建宏 文件 2.swift创建 常量文件 在swift中, 并非是预编译代码替换, 而是设置全局常量, 简单宏, 直接let 加常量名即可
- js实现的点击div区域外隐藏div区域
首先看下JS的事件模型,JS事件模型为向上冒泡,如onclick事件在某一DOM元素被触发后,事件将跟随节点向上传播,直到有click事件绑定在某一父节点上,如果没有将直至文档的根. 阻止冒泡:1.对 ...
- 一个简单的Python多线程
首先对一段普通的代码进行测试 # -*- coding:utf-8 -*- __author__ = "MuT6 Sch01aR" import time def RunThrea ...
- Access 数据库的数据类型
今天开发数据库通用组件时,做C#数据库类型与Access数据库类型的相互转化时,发现Access中“text”类型的最大长度为255,当长度超过255时,需改用“Memo”类型,但需要注意备注(Mem ...
- PCA主成分分析 ICA独立成分分析 LDA线性判别分析 SVD性质
机器学习(8) -- 降维 核心思想:将数据沿方差最大方向投影,数据更易于区分 简而言之:PCA算法其表现形式是降维,同时也是一种特征融合算法. 对于正交属性空间(对2维空间即为直角坐标系)中的样本点 ...
- Android 学习 - Telnet 控制AVD
启动Android Virtual Device之后,使用telnet,可以方便地控制AVD. 首先,获取端口号.启动AVD后,在标题栏上方会出现端口号:设备名,在下面的截图中为5554:N4-15- ...
- 一次 Mysql 字符集的报错,最后让我万马奔腾!!!
wuba---深圳---龙岗周边----3000元--------- wuba---深圳---龙岗周边----5000元--------- wuba---深圳---龙岗周边----8000元----- ...
- 【290】Python 常用说明
1. 双击直接运行 python 代码暂停显示的方法:python学习笔记(3)--IDLE双击运行后暂停 需要添加如下代码: import os os.system("pause" ...
- Ant 执行 exec cmd.exe 时路径包含空格的问题
需求描述 通过Ant脚本调用bat脚本 问题描述 bat脚本所在目录名称包含空格(space),cmd.exe调用时候报错The system cannot find the path specifi ...
- 安装express.js(NODEJS框架)
express.js是nodejs的一个MVC开发框架,并且支持jade等多种模板.下面简单来说说express的安装和app.js文件的配置,然后在今后的教程中一步一步使用express.js搭建个 ...