java支付寶即時(shí)到帳提交訂單功能
本文實(shí)例為大家分享了java支付寶即時(shí)到帳提交訂單的具體代碼,供大家參考,具體內(nèi)容如下
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 * 異步執(zhí)行地址 * @param body * 商品描述 * @param payment_type * 付款類(lèi)型 * @param out_trade_no * 訂單號(hào) (必填) * @param partner * 商家id * @param service * 服務(wù) * @param total_fee * 金額 (必填) * @param return_url * 返回展示地址 * @param sign_type * 加密方式(默認(rèn)md5) * @param seller_id * 同商家id * @param response * @param sessionId * sessionId * @return 成功 返回url;-1失?。▍?shù));-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); // 生成簽名結(jié)果 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 放置參數(shù)末尾 // 3.url 追加 _input_charset=utf-8 } catch (Exception e) { e.printStackTrace(); return "-2"; } } /////////////////////////////////////////////////////// /** * 除去數(shù)組中的空值和簽名參數(shù) * * @param sArray * 簽名參數(shù)組 * @return 去掉空值與簽名參數(shù)后的新簽名參數(shù)組 */ 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; } /** * 生成簽名結(jié)果 * * @param sPara * 要簽名的數(shù)組 * @return 簽名結(jié)果字符串 */ public static String buildRequestMysign(Map<String, String> sPara, String key, String input_charset) { String prestr = createLinkString(sPara); // 把數(shù)組所有元素,按照“參數(shù)=參數(shù)值”的模式用“&”字符拼接成字符串 String mysign = ""; mysign = sign(prestr, key, input_charset); return mysign; } /** * 把數(shù)組所有元素排序,并按照“參數(shù)=參數(shù)值”的模式用“&”字符拼接成字符串 * * @param params * 需要排序并參與字符拼接的參數(shù)組 * @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) {// 拼接時(shí),不包括最后一個(gè)&字符 prestr = prestr + key + "=" + value; } else { prestr = prestr + key + "=" + value + "&"; } } return prestr; } /** * 簽名字符串 * * @param text * 需要簽名的字符串 * @param key * 密鑰 * @param input_charset * 編碼格式 * @return 簽名結(jié)果 */ 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簽名過(guò)程中出現(xiàn)錯(cuò)誤,指定的編碼集不對(duì),您目前指定的編碼集是:" + charset); } } }
以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
相關(guān)文章
Spring?AOP?后置通知修改響應(yīng)httpstatus方式
這篇文章主要介紹了Spring?AOP?后置通知修改響應(yīng)httpstatus方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2021-12-12IDEA在一個(gè)工作空間中管理多個(gè)項(xiàng)目的詳細(xì)步驟
這篇文章主要介紹了IDEA在一個(gè)工作空間中管理多個(gè)項(xiàng)目的詳細(xì)步驟,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2021-01-01java常見(jiàn)報(bào)錯(cuò):Array?Out?of?Bounds兩種解決辦法
這篇文章主要給大家介紹了關(guān)于java報(bào)錯(cuò)Array?Out?of?Bounds的兩種解決辦法,Array out of bounds錯(cuò)誤表示你嘗試訪問(wèn)數(shù)組中不存在的索引,即索引小于零或者大于等于數(shù)組的大小,文中通過(guò)代碼將解決的辦法介紹的非常詳細(xì),需要的朋友可以參考下2024-08-08Java中的自動(dòng)裝箱與自動(dòng)拆箱的實(shí)現(xiàn)
自動(dòng)裝箱和自動(dòng)拆箱使得我們?cè)谑褂没緮?shù)據(jù)類(lèi)型時(shí)更加方便,同時(shí)也提高了代碼的可讀性和健壯性,本文將詳細(xì)介紹Java中的自動(dòng)裝箱和自動(dòng)拆箱機(jī)制,感興趣的可以了解一下2023-08-08解決IDEA開(kāi)發(fā)工具右側(cè)沒(méi)有Maven工具欄的問(wèn)題
這篇文章主要給大家解決了IDEA開(kāi)發(fā)工具右側(cè)沒(méi)有Maven工具欄的問(wèn)題,文中有詳細(xì)的解決步驟,如果有遇到一樣問(wèn)題的小伙伴,可以參考閱讀本文2023-09-09Dubbo?LoadBalance基于權(quán)重的隨機(jī)負(fù)載均衡算法提高服務(wù)性能
這篇文章主要為大家介紹了Dubbo?LoadBalance基于權(quán)重的隨機(jī)負(fù)載均衡算法提高服務(wù)性能詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪<BR>2023-10-10spring?cache注解@Cacheable緩存穿透詳解
這篇文章主要介紹了spring?cache注解@Cacheable緩存穿透詳解,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2021-12-12mybatis-plus生成mapper擴(kuò)展文件的方法
這篇文章主要介紹了mybatis-plus生成mapper擴(kuò)展文件的方法,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2020-09-09一段代碼搞懂關(guān)于Java中List、Set集合及Map的使用
這篇文章主要介紹了關(guān)于Java中List、Set集合及Map的使用及l(fā)ist,set和map三者的區(qū)別介紹,非常不錯(cuò),具有參考借鑒價(jià)值,需要的朋友可以參考下2016-08-08IDEA一致卡在build時(shí)間過(guò)長(zhǎng)問(wèn)題解決
有很多小伙伴在起項(xiàng)目的時(shí)候巨慢,特別影響開(kāi)發(fā)效率,本文主要介紹了IDEA一致卡在build時(shí)間過(guò)長(zhǎng)問(wèn)題解決,具有一定的參考價(jià)值,感興趣的可以了解一下2024-06-06