想到支付首先要知道,就是调用以及回调接口。

1:准备工作导入易宝支付SDK.jar到自己公司私服(公司使用的nexus搭建私服操作如下)

查看/存储库:库(Repositories)----在对应的库路径中添加
选择库路径--artifact upload上传:
    1:GAV定义
    2:配置组com.yeepay
    3:Artifact:c
    4:version:

**注意**:单存在多个jar(jdk/sources/sdk)的时候需要全部添加:add Artifact多次添加jar,加入完成后发布,可以在搜索中搜索添加的名字确认。

发布,并复制以来pom
结果:
<dependency>
<groupId>com.yeepay</groupId>
<artifactId>yop-java-sdk</artifactId>
<version>2.2.7</version>

</dependency>

一:易宝支付调用

枚举类PayTool.java:

package com.*.constants;/*** 钱麦支付方式*/
public enum PayTool {BALANCE("BALANCE","账户余额支付"),BINDCARD("BINDCARD","账户绑卡支付"),YEEPAYCASHIER("YEEPAYCASHIER","易宝支付键支付"),SALESB2C("SALESB2C","网银个人支付"),SALESB2B("SALESB2B","网银企业支付"),WECHATSCAN("WECHATSCAN","微信用户扫码支付"),WECHATAPP("WECHATAPP","微信H5支付仅移动端"),WECHATOFFICIAL("WECHATOFFICIAL","微信公众号支付仅限制微信浏览器"),WECHAT_MICROPAY("WECHAT_MICROPAY","微信刷卡"),WECHATSDK("WECHATSDK","微信APP支付"),ALIPAYSCAN("ALIPAYSCAN","支付宝用户扫码支付"),ALIPAYAPP("ALIPAYAPP","支付宝H5支付仅移动端"),ALIPAYSDK("ALIPAYSDK","支付宝APP支付"),ALIPAYTIMELY("ALIPAYTIMELY","支付宝即时到账仅PC端"),ALIPAY_MICROPAY("ALIPAY_MICROPAY","支付宝被扫支付");private String code;private String desc;public String getCode() {return code;}public void setCode(String code) {this.code = code;}public String getDesc() {return desc;}public void setDesc(String desc) {this.desc = desc;}PayTool(String code, String desc){this.code = code;this.desc = desc;}public static String getPayToolName(String code){for(PayTool type : PayTool.values()){if(code.equals(type.getCode())){return type.getDesc();}}return "";}
}

支付工具类YeepayUtil.java:

package com.*.utils;import com.*.constants.PayTool;
import com.yeepay.g3.sdk.yop.client.YopClient;
import com.yeepay.g3.sdk.yop.client.YopRequest;
import com.yeepay.g3.sdk.yop.client.YopResponse;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import java.io.IOException;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.Map;/*** 钱麦支付SDK调用工具类*/
public class YeepayUtil {private static Logger logger = LoggerFactory.getLogger(YeepayUtil.class);//读取系统配置文件private static final String appKey=SysConfig.getStringConfig("yeepay.appkey");//公司在钱麦的账号:BM123456789private static final String secretKey=SysConfig.getStringConfig("yeepay.secretKey");//公司在钱麦方的秘钥:Hhu9qik0ZQfGzWgR1Wc==private static final String secretRoot=SysConfig.getStringConfig("yeepay.secretRoot");//接口请求地址,钱麦方提供(固定https://open.yeepay.com/yop-center)/**** @param orderAmount* @param shouldPayAmount* @param payTool* @param productName* @param productDesc* @param returUrl* @param notifyUrl* @param requestNo  商户请求号格式(最大长度32)://三位随机码:交易号或订单号-----(因为同一单可能请求多次所以必须加入随机区分,并且订单号借口没有返回必须和请求号一起带回解析,也可以在回调接口中传入订单号,这样回调的时候又回带入)* @return* @throws IOException*/public static String yeePayCall(double orderAmount,double shouldPayAmount,PayTool payTool,String productName,String productDesc,String returUrl,String notifyUrl,String requestNo) throws IOException {String orderAmountDb = MathUtil.formatDouble(orderAmount);String shouldPayAmountDb = MathUtil.formatDouble(shouldPayAmount);YopRequest request = new YopRequest(appKey,secretKey,secretRoot);request.setEncrypt(true);//加密请求模式request.setSignRet(true);//是否需要验签request.setSignAlg("sha-256");//签名算法//添加请求参数request.addParam("requestNo", requestNo);request.addParam("merchantNo", appKey);request.addParam("orderAmount", orderAmountDb);//订单金额(保留2位小数大于等于0.01)request.addParam("fundAmount", shouldPayAmountDb);//需支付金额(保留2位小数大于等于0.01)
//        request.addParam("payTool", payTool.getCode());//支付方式(不传默认支付所有支付)request.addParam("merchantExpireTime", "");//订单有效期request.addParam("bankCode", "");//银行编码(payTool=SALESB2C或SALESB2B时)Date date = new Date();SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");request.addParam("merchantOrderDate", sdf.format(date));//支付下单时间request.addParam("webCallbackUrl", returUrl);//前端通知页面request.addParam("serverCallbackUrl", notifyUrl);//后台异步通知request.addParam("productName", productName);request.addParam("productDesc", productDesc);request.addParam("mcc", "3101");//行业类型(电商:3101)request.addParam("productCatalog", "3101");//产品类别码同mccrequest.addParam("templateType", "WAP");//WAP:显示页面title、APP:不显示YopResponse response = YopClient.post("/rest/v1.0/payplus/order/consume",request);String redirectUrl = "";String state = response.getState();//SUCCESS、FAILUREif("SUCCESS".equals(state)){Object result = response.getResult();if(null != result){Map map = (Map) response.getResult();String code = (String) map.get("code");redirectUrl = (String) map.get("redirectUrl");//支付链接String status = (String) map.get("status");//支付状态(UNPAY-未支付 SUCCESS-支付成功)if("1".equals(code)){//成功if("UNPAY".equals(status)){//未支付logger.info(">>>>>>>>>>>>>>>>未支付!!");}else if("SUCCESS".equals(status)){logger.info(">>>>>>>>>>>>>>>>支付成功!!");}else{logger.info("系统服务异常,请稍后再试!!!");}logger.info(">>>>>>>>>>>>>>>>成功跳转钱麦支付收银台:"+redirectUrl);return redirectUrl;/*byte[] b = hex2byte(redirectUrl);//转成imageByteArrayInputStream in = new ByteArrayInputStream(b);BufferedImage image = ImageIO.read(in);ImageIO.write(image, "jpg", new File("/Users/bin.guo/Desktop/IMG_5168.jpg"));exec("open /Users/bin.guo/Desktop/IMG_5168.jpg");*/}else{logger.info(">>>>>>>>>>>ErrorCode:"+code);logger.info(">>>>>>>>>>>ErrorMessage:"+response.getError());redirectUrl = "ERROR";return redirectUrl;}}else{logger.info("系统服务异常,请稍后再试!!!");redirectUrl = "ERROR";return redirectUrl;}}else if("FAILURE".equals(state)){logger.info(">>>>>>>>>>>ErrorCode:"+response.getError().getCode());logger.info(">>>>>>>>>>>ErrorMessage:"+response.getError().getMessage());redirectUrl = "FAILURE";return redirectUrl;}else{logger.info("系统服务异常,请稍后再试!!!");redirectUrl = "ERROR";return redirectUrl;}}public static void exec(String cmd) {try {String[] cmdA = {"/bin/sh", "-c", cmd};Runtime.getRuntime().exec(cmdA);} catch (Exception e) {e.printStackTrace();}}/**转字节方法*/public static byte[] hex2byte(String s) {byte[] src = s.toLowerCase().getBytes();byte[] ret = new byte[src.length / 2];for (int i = 0; i < src.length; i += 2) {byte hi = src[i];byte low = src[i + 1];hi = (byte) ((hi >= 'a' && hi <= 'f') ? 0x0a + (hi - 'a') : hi - '0');low = (byte) ((low >= 'a' && low <= 'f') ? 0x0a + (low - 'a'): low - '0');ret[i / 2] = (byte) (hi << 4 | low);}return ret;}/**测试方法*/public static void main(String[] s) throws IOException {YeepayUtil.yeePayCall(0.01,0.01,PayTool.SALESB2C,"测试商品名称","测试商品描述","","", String.valueOf(System.currentTimeMillis()));}
}
在Action中调用以上工具类拿到返回支付链接开始进入支付,调用上面工具类YeepayUtil.yeePayCall()执行;
String returUrl="支付成功还是失败都需要跳转的系统通知页面".replace("orderID", 订单对象.getId().toString());//进入对应的订单action处理返回页面通知
String notifyUrl = "异步回调接口http://www.baidu.com/notify/yeePayNotify.do";
String invokeUrl = "";//易宝支付返回的支付页面链接(提供前端location.href=invokeUrl)
String transactionNo = cmFinanceReceipts.getOrderNo();//商户订单号
String random= RandomCodeGenerator.generateCodeString(3);
String requestNo = random + ":" + transactionNo;//商户请求号格式:3位随机码:订单号
try {invokeUrl = YeepayUtil.yeePayCall(cmFinanceReceipts.getShouldPayAmount().doubleValue(),cmFinanceReceipts.getShouldPayAmount().doubleValue(),PayTool.SALESB2C,"大宗采购商品","大宗采购商品",returUrl,notifyUrl,requestNo);
} catch (Exception e) {logger.error("交易单号"+transactionNo+"进行易宝createInvokeURL时出错");e.printStackTrace();
}
return invokeUrl;

二、支付异步回调(只要是修改订单交易等 )

回调类中添加如下回调接口以及方法。

@RequestMapping(value = "yeePayNotify")
public String yeePayNotify(@Param("response") String response){logger.info("易宝支付回调start....");String result = "FAILURE";//回调返回易宝支付成功还是失败,以便易宝不会总是请求回调try {String reString = YopClient.acceptNotificationAsJson(secretKey, response);//通过秘钥解析回调数据System.out.println(reString);Map<String, Object> paramsMap = json2map(reString);logger.info(">>>>>>>>>>>回调参数:"+paramsMap);if (null != paramsMap) {String code = "";String status = "";String requestNo = "";String paidAmount = "";if(null != paramsMap.get("merchantUserId")){String merchantUserId = (String) paramsMap.get("merchantUserId");//商户用户唯一编号}if(null != paramsMap.get("orderAmount")){String orderAmount = (String) paramsMap.get("orderAmount");//商户订单总金额}if(null != paramsMap.get("fundAmount")){String fundAmount = (String) paramsMap.get("fundAmount");//实际需支付金额}if(null != paramsMap.get("cardLast")){String cardLast = (String) paramsMap.get("cardLast");//用户支付银行卡卡号后四位}if(null != paramsMap.get("cardType")){String cardType = (String) paramsMap.get("cardType");//用户支付银行卡的类别}if(null != paramsMap.get("bankCode")){String bankCode = (String) paramsMap.get("bankCode");//用户支付银行卡的银行编码}if(null != paramsMap.get("requestNo")){requestNo = (String) paramsMap.get("requestNo");//原商户请求号}if(null != paramsMap.get("paidAmount")){paidAmount = (String) paramsMap.get("paidAmount");//已支付金额}if(null != paramsMap.get("status")){status = (String) paramsMap.get("status");//订单状态(UNPAY:未支付、SUCCESS:支付成功、PROCESS:处理中)}if(null != paramsMap.get("code")){code = (String) paramsMap.get("code");//返回码}if(null != paramsMap.get("message")){String message = (String) paramsMap.get("message");//返回码的详细说明}logger.info(">>>>>>>>>>>返回码code:"+code + "状态status:"+status+"应付金额paidAmount:"+paidAmount+"商户请求号requestNo:"+requestNo);if(null != code && "1".equals(code)){//成功if (StringUtils.isBlank(requestNo)) {throw new BusinessException("requestNo is null");}if (StringUtils.isBlank(paidAmount)) {throw new BusinessException("paidAmount is null");}if (StringUtils.isBlank(status)) {throw new BusinessException("status is null");}String[] split = requestNo.split(":");//字符串:交易号或订单号if(split.length !=2){throw new BusinessException("参数校验失败");}String transactionNo = String.valueOf(split[1]);if (status.equals("SUCCESS")) {if (StringUtils.isBlank(transactionNo)) {throw new BusinessException("参数校验失败");}//todo  一切正常情况下更新业务订单信息。变更订单状态等。}} else {result = "FAILURE";}} else {result = "FAILURE";}} catch (Exception e) {logger.error("易宝支付回调错误" + e.toString(), e);result = "FAILURE";}printOut(result);logger.info("易宝支付回调end....");return result;
}/**打印输出结果
*/
public void printOut(String content) {ServletActionContext.getResponse().setContentType("application/json;charset=utf-8");PrintWriter out = null;try {out = ServletActionContext.getResponse().getWriter();out.print(content);out.flush();} catch (Exception ex) {out.println(ex.toString());} finally {if (out != null) {try {out.close();} catch (Exception e) {logger.error(e.toString(), e);}}}
}

易宝支付[钱麦](附代码)相关推荐

  1. java在线支付---09,10,11,12_在线支付_分析易宝支付网关的应答协议与处理代码,完成用于处理支付响应的Servlet的初步编写和调试,完成处理支付网关响应结果的Servlet,支付实现

    09_在线支付_分析易宝支付网关的应答协议与处理代码 创梦综合技术qq交流群:CreDream:251572072 对支付结果返回的数据加密生成md5-hmac public static boole ...

  2. 开发自己的网上支付案例代码(易宝支付php)

    1.简单的图解(如上所示) 易宝支付与支付宝是不一样的,但也有类似之处,支付宝是专门为淘宝软件开发的一套机制,资金会在中间支付公司(支付宝)停留,等待顾客确认,当顾客确认后,才会真正扣钱.而易宝支付时 ...

  3. 第三方支付平台:易宝支付

    国付宝国企 LianLianPay连连支付 这个比较好用,可以自己试试 我这里说的是易宝支付 两种在线支付的方式 在线支付一共有两种方式: 电商直接与银行对接: 电商通过第三方支付平台与银行对接: 电 ...

  4. 支付入门-易宝支付实践

    无意中发现了一个巨牛的人工智能教程,忍不住分享一下给大家.教程不仅是零基础,通俗易懂,而且非常风趣幽默,像看小说一样!觉得太牛了,所以分享给大家.点这里可以跳转到教程. 易宝支付的规范和流程 1)发起 ...

  5. 易宝支付Demo,生产中封装成简洁的代付接口,不用request如何获取项目运行时的真实路径...

    最近项目在做融360引流,涉及到了易宝支付的代扣和代付.易宝官方给出的demo只能简单运行,而且都是通过form表单的形式提交,返回XML格式.同时接口代码都写在了JSP中看起来不友好.项目在生成中想 ...

  6. 【SSH网上商城项目实战21】从Demo中看易宝支付的流程

    这一节我们先写一个简单点的Demo来测试易宝支付的流程,熟悉这个流程后,再做实际的开发,因为是一个Demo,所以我没有考虑一些设计模式的东西,就是直接实现支付功能.实现支付功能需要易宝给我们提供的AP ...

  7. 易宝支付碰到 交易签名无效问题

    今天在易宝支付问题上给纠结了半天,将模块加进文件中,设置好商户ID与密钥,加上对应的域名,是可以实现在线支付问题.但我现在要的功能是要按不同的分组,去读取不同的商户ID与密钥,因些,我将这些存到数据库 ...

  8. 易宝支付碰到 交易签名无效问题 (2)

    无意中翻了翻旧日的代码,原来在上一次交易签名无效的问题仅仅是出现在一个调用的问题上,merchantProperties.php被调用了两次,当第一次被调用的时候是正确加载的,而在第二次调用的时候出就 ...

  9. java在线支付---03_分析易宝支付网关的请求协议

    03_分析易宝支付网关的请求协议 创梦综合技术qq交流群:CreDream:251572072 -------------------------------------- 1.buildHmac() ...

最新文章

  1. P2P Device Discovery流程分析
  2. 《GPU高性能编程CUDA实战》中代码整理
  3. LIST组件使用总结
  4. is not allowed to connect to this MySQL server解决办法
  5. Masm for Windows集成开发环境编写汇编程序
  6. bzoj2957:楼房重建
  7. VHDL交通灯控制器的设计
  8. 【SDOI2018】战略游戏【圆方树】【虚树】
  9. java刷卡机_JavaPOS
  10. 源码 连接mysql_MySql轻松入门系列————第一站 从源码角度轻松认识mysql整体框架图...
  11. 计算机控制基础知识,最新 分析计算机控制系统及其运算基础知识-精品
  12. 如何在 Spring 中自定义 scope
  13. 手机号验证最新正则表达式
  14. 批量合并txt文件中的数据
  15. 企鹅智库《2019-2020中国互联网趋势报告》
  16. 【线性系统】五、稳定性
  17. Multitask Learning
  18. 中国出口印度尼西亚主要商品
  19. 思科C9500交换机介绍及光模块解决方案
  20. java实现 库鲁斯卡尔算法 kruskal(算法设计与分析作业)

热门文章

  1. XGBoost导读与实战阅读记录(一)——rabit和allreduce
  2. 制作一个类“全能扫描王”的简易扫描软件(opencv)
  3. 内网渗透-内网代理穿透和内网横向移动
  4. [Lorg/openxmlformats/schemas/spreadsheetml/x2006/main/CTPhoneticRun报错
  5. Intellij Idea Database schemas显示
  6. quick框架之MyApp详解
  7. python一行输入n个数据
  8. 苏世民,我的经验和教训(五)
  9. r语言 柱状图加星号_R语言-柱状图
  10. html5 css3制作柱形图,一步一步教你实现纯CSS的柱形图