支付宝(移动支付)服务端java版
2016-12-28 17:13
351 查看
所需支付宝jar包: sdk2-2.0.jar(点击下载)
工具类目录结构:点击下载
商户信息已经公钥私钥的配置(公钥私钥的生成与支付宝商户平台配置请看官方文档:https://doc.open.alipay.com/doc2/detail.htm?spm=a219a.7629140.0.0.nBDxfy&treeId=58&articleId=103242&docType=1、https://doc.open.alipay.com/docs/doc.htm?spm=a219a.7629140.0.0.BfaKdz&treeId=58&articleId=103578&docType=1),
AlipayConfig
接口controller:
官方文档:https://doc.open.alipay.com/docs/doc.htm?spm=a219a.7629140.0.0.VbKyV2&treeId=59&articleId=103563&docType=1
参考资料:
技术客服:
https://cschannel.alipay.com/newPortal.htm?scene=mt_zczx&token=&pointId=&enterurl=https%3A%2F%2Fsupport.open.alipay.com%2Falipay%2Fsupport%2Findex.htm
教程
http://blog.csdn.net/xingzizhanlan/article/details/52709899
公钥私钥:
https://doc.open.alipay.com/doc2/detail.htm?spm=a219a.7629140.0.0.nBDxfy&treeId=58&articleId=103242&docType=1
文档:
https://doc.open.alipay.com/docs/doc.htm?spm=a219a.7629140.0.0.rnMrxU&treeId=193&articleId=105465&docType=1
http://www.cnblogs.com/xu-xiang/p/5797643.html
网页支付:
http://www.jb51.net/article/88127.htm
支付宝和微信支付:
简书:http://www.jianshu.com/p/a4f515387264
12.2:
支付宝支付:
http://blog.csdn.net/fengshizty/article/details/53215196
app支付和移动支付的疑问:
http://www.cnblogs.com/harris-peng/p/6007020.html
工具类目录结构:
商户信息已经公钥私钥的配置(公钥私钥的生成与支付宝商户平台配置请看官方文档:
AlipayConfig
packagecom.rpframework.module.common.pay.alipay.config; publicclassAlipayConfig{ //↓↓↓↓↓↓↓↓↓↓请在这里配置您的基本信息↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓ //合作身份者ID,以2088开头由16位纯数字组成的字符串 publicstaticStringpartner="2088..."; //商户的私钥 publicstaticStringprivate_key="MIICdgIBADANBgkqhkiG9w0BAQEFAASCAmAwggJcAgEAAoGBAKXcJq3Aj7uwht..."; publicstaticStringseller_email="2088..."; //支付宝的公钥 publicstaticStringali_public_key="MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQCnxj/9qwVfgoUh/y2W89..."; //↑↑↑↑↑↑↑↑↑↑请在这里配置您的基本信息↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑ //调试用,创建TXT日志文件夹路径 publicstaticStringlog_path="D:\\"; //字符编码格式目前支持gbk或utf-8 publicstaticStringinput_charset="utf-8"; //签名方式 publicstaticStringsign_type="RSA"; }
PayUtils
packagecom.rk.shows.util; importcom.rk.shows.util.alipay.config.AlipayConfig; importcom.rk.shows.util.alipay.util.SignUtils; importjava.io.UnsupportedEncodingException; importjava.net.URLEncoder; /** * *支付基本信息 *@authorzhangli *@date2016年3月28日下午2:35:24 * * *1.需要支付的信息: *用户支付支付相关业务支付金额回调业务 *2.第三方支付需要的信息: *trade_no,subject,body,total_fee,notify_url * */ publicclassPayUtils{ publicstaticStringsign(Stringcontent,StringRSA_PRIVATE){ returnSignUtils.sign(content,RSA_PRIVATE); } /** *支付宝支付 *@paramtrade_no订单号 *@paramtotal_fee金额 *@paramsubject标题 *@parambody内容 *@paramnotify_url回调地址 *@return *@throwsUnsupportedEncodingException */ publicstaticStringAliPay(Stringtrade_no,Doubletotal_fee,Stringsubject,Stringbody,Stringnotify_url)throwsUnsupportedEncodingException{ StringorderInfo="_input_charset=\"utf-8\""; orderInfo+="&body="+"\""+body+"\""; orderInfo+="&it_b_pay=\"30m\""; orderInfo+="¬ify_url="+"\""+notify_url+"\""; orderInfo+="&out_trade_no="+"\""+trade_no+"\""; orderInfo+="&partner="+"\""+AlipayConfig.partner+"\""; orderInfo+="&payment_type=\"1\""; orderInfo+="&return_url=\""+notify_url+"\""; orderInfo+="&seller_id="+"\""+AlipayConfig.seller_email+"\""; orderInfo+="&service=\"mobile.securitypay.pay\""; orderInfo+="&subject="+"\""+subject+"\""; Stringformat=String.format("%.2f",total_fee); if(format.indexOf(",")>0)format=format.replace(",","."); orderInfo+="&total_fee="+"\""+format+"\""; System.out.println(orderInfo); Stringsign=sign(orderInfo,AlipayConfig.private_key); sign=URLEncoder.encode(sign,"utf-8"); returnorderInfo+"&sign=\""+sign+"\"&"+"sign_type=\"RSA\""; } }
接口controller:
packagecom.textile.controller; importcom.rpframework.core.json.FailException; importcom.rpframework.core.json.JsonResp; importcom.rpframework.core.json.ParameterException; importcom.rpframework.module.common.bottom.controller.BaseController; importcom.rpframework.module.common.pay.alipay.util.AlipayNotify; importcom.rpframework.module.common.url.RequestDescription; importcom.textile.dto.MoneyDto; importcom.textile.entity.MemberIntroduction; importcom.textile.entity.MoneyRecord; importcom.textile.entity.User; importcom.textile.service.MemberIntroductionService; importcom.textile.service.MoneyRecordService; importcom.textile.service.UserService; importcom.textile.util.PayUtils; importorg.springframework.beans.factory.annotation.Autowired; importorg.springframework.stereotype.Controller; importorg.springframework.transaction.annotation.Transactional; importorg.springframework.web.bind.annotation.RequestMapping; importorg.springframework.web.bind.annotation.ResponseBody; importjavax.servlet.http.HttpServletRequest; importjava.io.ByteArrayOutputStream; importjava.io.IOException; importjava.io.InputStream; importjava.math.BigDecimal; importjava.util.*; /** *Createdbybinon2016/11/16. */ @ResponseBody @Controller @RequestMapping publicclassMoneyController{ //http://139.224.42.24:8899 //http://tt.tunnel.2bdata.com publicstaticStringalinotify="/api/json/money/alipay/succ"; @RequestMapping @RequestDescription("支付宝支付回调地址") @Transactional(rollbackFor=Throwable.class) publicStringalipaySucc(HttpServletRequestrequest)throwsIOException{ System.out.println("支付宝回调"); Map<String,String>params=newHashMap<>(); Map<String,String[]>requestParams=request.getParameterMap(); for(Iterator<String>iter=requestParams.keySet().iterator();iter.hasNext();){ Stringname=iter.next(); String[]values=requestParams.get(name); StringvalueStr=""; for(inti=0;i<values.length;i++){ valueStr=(i==values.length-1)?valueStr+values[i]:valueStr+values[i]+","; } //乱码解决,这段代码在出现乱码时使用。如果mysign和sign不相等也可以使用这段代码转化 //valueStr=newString(valueStr.getBytes("ISO-8859-1"),"gbk"); params.put(name,valueStr); } //Stringout_trade_no=request.getParameter("out_trade_no");//商户订单号 //获取支付宝的通知返回参数,可参考技术文档中页面跳转同步通知参数列表(以下仅供参考)// //商户订单号 //Stringout_trade_no=newString(request.getParameter("out_trade_no").getBytes("ISO-8859-1"),"UTF-8"); //支付宝交易号 //Stringtrade_no=newString(request.getParameter("trade_no").getBytes("ISO-8859-1"),"UTF-8"); //交易状态 Stringtrade_status=newString(request.getParameter("trade_status").getBytes("ISO-8859-1"),"UTF-8"); //获取支付宝的通知返回参数,可参考技术文档中页面跳转同步通知参数列表(以上仅供参考)// if(AlipayNotify.verify(params)){//验证成功 ////////////////////////////////////////////////////////////////////////////////////////// //请在这里加上商户的业务逻辑程序代码 //——请根据您的业务逻辑来编写程序(以下代码仅作参考)—— if(trade_status.equals("TRADE_FINISHED")){ //判断该笔订单是否在商户网站中已经做过处理 //如果没有做过处理,根据订单号(out_trade_no)在商户网站的订单系统中查到该笔订单的详细,并执行商户的业务程序 //请务必判断请求时的total_fee、seller_id与通知时获取的total_fee、seller_id为一致的 //如果有做过处理,不执行商户的业务程序 //注意: //退款日期超过可退款期限后(如三个月可退款),支付宝系统发送该交易状态通知 }elseif(trade_status.equals("TRADE_SUCCESS")){ //判断该笔订单是否在商户网站中已经做过处理 //如果没有做过处理,根据订单号(out_trade_no)在商户网站的订单系统中查到该笔订单的详细,并执行商户的业务程序 //请务必判断请求时的total_fee、seller_id与通知时获取的total_fee、seller_id为一致的 //如果有做过处理,不执行商户的业务程序 //注意: //付款完成后,支付宝系统发送该交易状态通知 Stringtotal_fee=params.get("total_fee"); LonguserId=Long.valueOf(params.get("out_trade_no").split("O")[0]); //updateUserPay(userId,total_fee); return"success"; } //——请根据您的业务逻辑来编写程序(以上代码仅作参考)—— ////////////////////////////////////////////////////////////////////////////////////////// }else{//验证失败 System.out.println("+++++++++++++++++++=验证失败"); return"fail"; } return"fail"; } /* privatevoidupdateUserPay(LonguserId,Stringtotal_fee){ Useruser=userService.selectByPrimaryKey(userId); if(user!=null){ user.setPassword(null); //余额 BigDecimalaccount=user.getAccount()==null?BigDecimal.valueOf(0.00):user.getAccount(); user.setAccount(account.add(BigDecimal.valueOf(Double.valueOf(total_fee)))); //积分 //BigDecimalintegral=user.getIntegral()==null?BigDecimal.valueOf(0.00):user.getIntegral(); //user.setIntegral(integral.add(BigDecimal.valueOf(Double.valueOf(total_fee)))); inti=userService.updateByPrimaryKeySelective(user); if(i<=0){ log.debug("更新用户出错"); } //充值记录 MoneyRecordmoneyRecord=newMoneyRecord(); moneyRecord.setTitle("充值"); moneyRecord.setType(1); moneyRecord.setMoneyChange("+"+total_fee); moneyRecord.setUserId(userId); moneyRecordService.insertJson(moneyRecord); log.debug("记录添加成功"); } } */ @RequestMapping @RequestDescription("支付宝充值") @Transactional(rollbackFor=Throwable.class) publicJsonResp<?>getAlipayOrderSign(Doublemoney,HttpServletRequestrequest)throwsException{ Stringsym=request.getRequestURL().toString().split("/api/")[0]; LonguserId=baseController.getUserId(); Stringtrade_no0=userId+"O"+UUID.randomUUID().toString().replaceAll("-","").toLowerCase(); Stringtrade_no=trade_no0.substring(0,32); StringstringStringMap=null; stringStringMap=PayUtils.AliPay( trade_no, money, //金额 "纺织达人充值",//订单名称 "纺织达人充值",//订单说明 sym+alinotify//回调哪个方法 ); if(stringStringMap!=null){ str=stringStringMap.substring(17,stringStringMap.length()-3); } JsonResp<String>jsonResp=newJsonResp<>(); if(stringStringMap!=null){ returnjsonResp.data(stringStringMap); }else{ thrownewFailException(); } } }
官方文档:
参考资料:
技术客服:
教程
公钥私钥:
文档:
网页支付:
支付宝和微信支付:
简书:
12.2:
支付宝支付:
app支付和移动支付的疑问:
相关文章推荐
- Spring Security授权 AccessDecisionManager
- 常用加密算法的Java实现总结(二)——对称加密算法DES、3DES和AES
- 使用eclipse中egit clone csdn code中的项目
- Struts进阶学习
- 常用加密算法的Java实现(一)——单向加密算法MD5和SHA
- Java中六大时间类的使用和区别
- 文件夹的复制--递归算法
- Java根据当前日期获得这一周的日期
- LeetCode459——Repeated Substring Pattern
- Java8系列之重新认识HashMap
- 13. 处理静态资源【从零开始学Spring Boot】
- java自动判断文件编码格式
- JavaWeb博客推荐
- SpringMVC redirect乱码问题
- java中if和switch哪个效率快
- Java Socket长连接示例代码
- Struts2配置描述及项目走向流转
- SpringMVC配置@Responsebody返回json不带转义字符
- Java socket长连接代码实现
- Struts框架学习基础