很多做电商的都需要和金额打交道,银联,支付宝等支付方式是必不可少的。
其实做这些东西都不难,难的主要是没有文档,demo。你只需要按照文档的要求来就行了,一切都ok。
这些东西拿到并不难,主要是你的商户需要去申请。申请了有商户号,密钥等这些必要的参数。不然你只能把代码写好,等银联,支付宝批下来了,你才可以调试
银联:
类型:unionpay
请求的参数
Map<String, String> sParaTemp = new HashMap<String, String>();
// 这些是固定的信息
sParaTemp.put("version", "1.0.0"); // 协议版本
sParaTemp.put("charset", "UTF-8"); // 字符编码
sParaTemp.put("transType", "01"); // 交易类型 01代表的是支付交易
sParaTemp.put("merAbbr", ); // 商户名称
sParaTemp.put("merId", ); // 商户代码
sParaTemp.put("merCode", ""); // 商户类型
sParaTemp.put("backEndUrl",); // 通知URL就是商户接收银联返回来的地址
sParaTemp.put("frontEndUrl",); // 当用户完成支付时候,跳转的URL地址
sParaTemp.put("acqCode", ""); // 收单机构
// 订单信息
sParaTemp.put("orderTime",); // 订单时间
sParaTemp.put("orderNumber", ); // 订单号
sParaTemp.put("commodityName", );// 订单名称
sParaTemp.put("commodityUrl", "");
sParaTemp.put("commodityUnitPrice", ""); // 商品单价
sParaTemp.put("commodityQuantity", ""); // 商品数量
sParaTemp.put("transferFee", ""); // 运输费用
sParaTemp.put("commodityDiscount", ""); // 优惠信息
sParaTemp.put("orderAmount", total_fee + ""); // 交易金额
sParaTemp.put("orderCurrency", "156"); // 币种:人民币
sParaTemp.put("customerName", );// 持卡人姓名,因为是邮箱注册,可能有非法字符,所以取会员ID
sParaTemp.put("defaultPayType", ""); // 默认支付方式
sParaTemp.put("defaultBankNumber", ""); // 默认银行代码
sParaTemp.put("transTimeout", ""); // 交易超时时间
sParaTemp.put("customerIp",); // 持卡人IP
sParaTemp.put("origQid", ""); // 原交易流水号
sParaTemp.put("merReserved", merReserved); // 商户保留域
return UnionpayUtils.createPayHtml(sParaTemp, key); 这个方法是把你的参数进行排序,然后再拼一个form让它自动发送
public static String createPayHtml(Map<String, String> map, String key) {
Map<String, String> treeMap = new TreeMap<String, String>();
treeMap.putAll(map);
treeMap.put("signature", md5(joinMapValue(treeMap, '&') + md5(key)));
treeMap.put("signMethod", signType);
return generateAutoSubmitForm(payment, treeMap);
}
public static String joinMapValue(Map<String, String> map, char connector) {
StringBuffer b = new StringBuffer();
for (Map.Entry<String, String> entry : map.entrySet()) {
b.append(entry.getKey());
b.append('=');
if (entry.getValue() != null) {
b.append(entry.getValue());
}
b.append(connector);
}
System.out.println("params:"+b.toString());
return b.toString();
}
private static String generateAutoSubmitForm(String actionUrl,
Map<String, String> paramMap) {
StringBuilder html = new StringBuilder();
html.append("<form id=\"pay_form\" name=\"pay_form\" action=\"");
html.append(actionUrl).append("\" method=\"post\">\n");
for (String key : paramMap.keySet()) {
html.append("<input type=\"hidden\" name=\"" + key + "\" id=\""
+ key + "\" value=\"" + paramMap.get(key) + "\">\n");
}
html.append("</form>");
html.append("<script language='JavaScript' type='text/JavaScript'>");
html.append("document.pay_form.submit()");
html.append("</script>");
return html.toString();
}
返回处理
public String onReturn() {
HttpServletRequest request = ThreadContextHolder.getHttpRequest();
//获取银联过来反馈信息
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] + ",";
}
params.put(name, valueStr);
}
String returnMsg = "";
//进行参数验证
if(checkSign(params)){
处理自己的业务逻辑
}
return returnMsg;
}
/**
* 支付返回的处理 验证签名
*/
public boolean checkSign(Map<String, String> map) {
Map<String,String> treeMap = new TreeMap<String,String>();
treeMap.putAll(map);
if (treeMap.get("signature") == null)
return false;
if (signType.equalsIgnoreCase(treeMap.get("signMethod"))) {
return treeMap.get("signature")
.equals(md5(joinMapValue(treeMap, '&') + md5(securityKey)));
} else {
return verifyWithRSA(
treeMap.get("signMethod"),md5(joinMapValue(treeMap, '&') + md5(securityKey)),
treeMap.get("signature"));
}
}
基本完事,不晓得还有木有没有复制出来的(这些都是从我自己开发的项目中拿出来的)
支付宝:
类型:支付宝即时到账
//把请求参数打包成数组
Map<String, String> sParaTemp = new HashMap<String, String>();
sParaTemp.put("payment_type", "1");
sParaTemp.put("out_trade_no",);//订单号
sParaTemp.put("subject", );//订单名称
sParaTemp.put("body", );//订单描述
sParaTemp.put("total_fee",);//交易金额
sParaTemp.put("show_url", );//商品的地址
sParaTemp.put("paymethod", );//默认支付方式,取值见“即时到帐接口”技术文档中的请求参数列表
sParaTemp.put("defaultbank", );//默认网银代号
sParaTemp.put("anti_phishing_key", );//防钓鱼时间戳
sParaTemp.put("exter_invoke_ip",);//获取客户端的IP地址
sParaTemp.put("extra_common_param", );//自定义参数,可存放任何内容(除=、&等特殊字符外),不会显示在页面上
sParaTemp.put("buyer_email", );//默认买家支付宝账号
sParaTemp.put("royalty_type", );//提成类型,该值为固定值:10,不需要修改
sParaTemp.put("royalty_parameters", );//提成信息集
//增加基本配置 partner,seller_email 都是申请的时候需要的信息
sParaTemp.put("service", "create_direct_pay_by_user");
sParaTemp.put("partner", );
sParaTemp.put("return_url", );//返回地址
sParaTemp.put("notify_url", );//后台通知地址
sParaTemp.put("seller_email", );//
sParaTemp.put("_input_charset", );//这里支付宝有两种编码格式GBK,UTF-8
return AlipaySubmit.buildForm(sParaTemp, AlipayService.ALIPAY_GATEWAY_NEW, "get",key);
这个AlipaySubmit.buildForm()是支付宝的包里面的方法,直接调用就行了
返回
Map<String,String> cfgparams = paymentManager.getConfigParams(this.getId());
HttpServletRequest request = ThreadContextHolder.getHttpRequest();
String key =cfgparams.get("key");
String partner =cfgparams.get("partner");
String encoding= cfgparams.get("return_encoding");
//获取支付宝GET过来反馈信息
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] + ",";
}
//根据自己的需求看看是否需要转码,如果你的tomcat 编码格式设置了UTF-8,基本不需要转码
// if(!StringUtil.isEmpty(encoding)){
// valueStr = StringUtil.to(valueStr, encoding);
// }
params.put(name, valueStr);
}
//计算得出通知验证结果
boolean verify_result = AlipayNotify.returnverify(params,key,partner);
if(("TRADE_FINISHED".equals(trade_status) || "TRADE_SUCCESS".equals(trade_status))){//验证成功
//写你自己的业务逻辑,修改订单的状态什么的
}
=====================================支付宝方式2=======================================
2、从本站提交到支付宝:
/**
* 将订单提交支付宝进行网上支付
*/
public ActionForward submitAlipayUrl(ActionMapping mapping,
ActionForm form, HttpServletRequest request,
HttpServletResponse response) throws Exception {
String orderNo = request.getParameter("orderNo");//订单编号
HashMap hm = new HashMap();
hm.put("_input_charset", "utf-8");// 采用相同的编码方式
hm.put("body", "企鹅个性化图书订单,订单号:" + orderNo);// 填写在跳到支付宝页面上显示的付款内容信息
hm.put("notify_url", "http://127.0.0.1:8888/mypenguin/orders.do?method=AlipayNotify");// 客户付款后,支付宝调用的页面
hm.put("out_trade_no", orderNo);// 外部交易号,最好具有唯一性,在获取支付宝发来的付款信息时使用.
hm.put("partner", "2088002302055380");// partnerId(合作伙伴ID)
//hm.put("agent", "2088002302055380");// partnerId(合作伙伴ID)
hm.put("payment_type", "1");// 支付类型 1=商品购买,2=服务购买,...
//hm.put("price", "178.00");// 订单金额信息
hm.put("total_fee", "178.00");// 订单金额和信息
//hm.put("quantity", "1");// 订单商品数量,一般都是写1,它是按照整个订单包来计算
hm.put("return_url", "http://127.0.0.1:8888/mypenguin/orders.do?method=AlipayReturn");// 客户付款成功后,显示给客户的页面
hm.put("show_url", "http://127.0.0.1:8888/mypenguin/books.do?method=list&kindId=1");//展示地址,即在支付页面时,商品名称旁边的“详情”的链接地址。
hm.put("seller_email", "monicali_7766@sina.com");// 你的支付宝账户email
hm.put("service", "create_direct_pay_by_user");// create_direct_pay_by_user=直接付款,trade_create_by_buyer=担保付款
hm.put("subject", "企鹅个性化图书订单号:" + orderNo);// 填写在跳到支付宝页面上显示的付款标题信息
String payGateway = "https://www.alipay.com/cooperate/gateway.do";// 跳转到支付宝的url头
String securityCode="7nj9sczcnfc4n8366j46mrzsbqjksmzn";//securityCode(安全码);
String sign = makeUrl(hm,securityCode,"utf-8",payGateway);//securityCode(安全码);
hm.put("sign", sign);
hm.put("sign_type", "MD5");
PrintWriter out = response.getWriter();
out.println("<form name='alipaysubmit' method='post' action='https://www.alipay.com/cooperate/gateway.do?_input_charset=utf-8' >");
out.println("<input type='hidden' name='service' value='" + hm.get("service") + "'>");
out.println("<input type='hidden' name='partner' value='" + hm.get("partner") + "'>");
out.println("<input type='hidden' name='seller_email' value='" + hm.get("seller_email") + "'>");
out.println("<input type='hidden' name='out_trade_no' value='" + hm.get("out_trade_no") + "'>");
out.println("<input type='hidden' name='subject' value='" + hm.get("subject") + "'>");
out.println("<input type='hidden' name='body' value='" + hm.get("body") + "'>");
out.println("<input type='hidden' name='total_fee' value='" + hm.get("total_fee") + "'>");
out.println("<input type='hidden' name='show_url' value='" + hm.get("show_url") + "'>");
out.println("<input type='hidden' name='return_url' value='" + hm.get("return_url") + "'>");
out.println("<input type='hidden' name='notify_url' value='" + hm.get("notify_url") + "'>");
out.println("<input type='hidden' name='payment_type' value='1'>");
out.println("<input type='hidden' name='sign' value='" + hm.get("sign") + "'>");
out.println("<input type='hidden' name='sign_type' value='" + hm.get("sign_type") + "'>");
out.println("</form>");
out.println("<script>");
out.println(" document.alipaysubmit.submit()");
out.println("</script>");
return null;
}
/**
* 根据传入的参数生成Alipay的支付URL
* @param hm 参数值
* @param securityCode 安全码
* @param charset 编码
* @param payGateway 支付宝gateway
* @return
*/
public static String makeUrl(HashMap hm,String securityCode,String charSet,String payGateway) throws Exception{
List keys = new ArrayList(hm.keySet());
Collections.sort(keys);//支付宝要求参数必须按字母排序
StringBuffer content = new StringBuffer();
for (int i = 0; i < keys.size(); i++) {
content.append((String) keys.get(i));
content.append("=");
content.append((String) hm.get((String) keys.get(i)));
if (i != keys.size() - 1) {
content.append("&");
}
}
content.append(securityCode);
String sign = DataUtil.MD5Encode(content.toString(), charSet); //MD5加密
return sign;
}
2、return_url的内容:
/**
* 支付宝支付完成以后,当前窗口会从支付宝的页面跳转回这个页面。该页面称作“返回页”,
* 是同步被支付宝服务器所调用,可当作是支付完成后的提示信息页,如“您的某某某订单,多少金额已支付成功”。
*/
public ActionForward AlipayReturn(ActionMapping mapping,
ActionForm form, HttpServletRequest request,
HttpServletResponse response) throws Exception {
String alipayNotifyURL = "https://www.alipay.com/cooperate/gateway.do?service=notify_verify";
//String alipayNotifyURL = "http://notify.alipay.com/trade/notify_query.do?";//此路径是在上面链接地址无法起作用时替换使用。
alipayNotifyURL = alipayNotifyURL+ "&partner=2088002302055380¬ify_id="+ request.getParameter("notify_id");
// 获取支付宝ATN返回结果,true是正确的订单信息,false 是无效的
String responseTxt = check(alipayNotifyURL);
// 获得POST 过来参数设置到新的requestParams中
Map requestParams = request.getParameterMap();
List keys = new ArrayList(requestParams.keySet());
Collections.sort(keys);
StringBuffer content = new StringBuffer();
for (int i = 0; i < keys.size(); i++) {
String key=(String) keys.get(i);
if(!key.equals("")&&!key.equals("sign")&&!key.equals("sign_type")){
content.append((String) keys.get(i));
content.append("=");
content.append((String)requestParams.get((String) keys.get(i)));
if (i != keys.size() - 1) {
content.append("&");
}
}
}
String securityCode="7nj9sczcnfc4n8366j46mrzsbqjksmzn";//securityCode(安全码);
content.append(securityCode);
String mysign = DataUtil.MD5Encode(content.toString(), "utf-8");
System.out.println("--------------------------content="+content);
System.out.println("--------------------------mysign="+mysign);
System.out.println("--------------------------sign="+request.getParameter("sign"));
if (mysign.equals(request.getParameter("sign")) && responseTxt.equals("true") ){
if (request.getParameter("trade_status").equalsIgnoreCase("TRADE_FINISHED")){
// 可以做重定向,也可以用来虚拟物品发货
}
return mapping.findForward("payOK");//交易成功
}else{
return mapping.findForward("payFail");//交易失败
}
}
3、notify_url的内容:
/**
* 通知返回URL,仅适用于异步返回处理结果的接口。有些服务是无法立即返回处理结果的,那么需要通过这个URL将处理结果异步返回给合作伙伴
*/
public ActionForward AlipayNotify(ActionMapping mapping,
ActionForm form, HttpServletRequest request,
HttpServletResponse response) throws Exception {
String alipayNotifyURL = "https://www.alipay.com/cooperate/gateway.do?service=notify_verify";
//String alipayNotifyURL = "http://notify.alipay.com/trade/notify_query.do?";//此路径是在上面链接地址无法起作用时替换使用。
alipayNotifyURL = alipayNotifyURL+ "&partner=2088002302055380¬ify_id="+ request.getParameter("notify_id");
// 获取支付宝ATN返回结果,true是正确的订单信息,false 是无效的
String responseTxt = check(alipayNotifyURL);
// 获得POST 过来参数设置到新的requestParams中
Map requestParams = request.getParameterMap();
List keys = new ArrayList(requestParams.keySet());
Collections.sort(keys);
StringBuffer content = new StringBuffer();
for (int i = 0; i < keys.size(); i++) {
String key=(String) keys.get(i);
if(!key.equals("")&&!key.equals("sign")&&!key.equals("sign_type")){
content.append((String) keys.get(i));
content.append("=");
content.append((String)requestParams.get((String) keys.get(i)));
if (i != keys.size() - 1) {
content.append("&");
}
}
}
String securityCode="7nj9sczcnfc4n8366j46mrzsbqjksmzn";//securityCode(安全码);
content.append(securityCode);
String mysign = DataUtil.MD5Encode(content.toString(), "utf-8");
System.out.println("--------------------------content="+content);
System.out.println("--------------------------mysign="+mysign);
System.out.println("--------------------------sign="+request.getParameter("sign"));
if (mysign.equals(request.getParameter("sign")) && responseTxt.equals("true") ){
if (request.getParameter("trade_status").equalsIgnoreCase("TRADE_FINISHED")){
// 可以做重定向,也可以用来虚拟物品发货
}
return mapping.findForward("payOK");
}else{
return mapping.findForward("payFail");
}
}
/**
* @param myUrl
*
* @param url
*
* @return 获取url内容
*/
public static String check(String urlvalue ) {
String inputLine = "";
try
{
URL url = new URL(urlvalue);
HttpURLConnection urlConnection = (HttpURLConnection)url.openConnection();
BufferedReader in = new BufferedReader(new InputStreamReader(urlConnection.getInputStream()));
String stTemp = "";
while((stTemp = in.readLine()) != null)
{
System.out.println(stTemp);
inputLine = inputLine + stTemp;
}
}
catch(Exception e)
{
e.printStackTrace();
}
return inputLine;
}