java实现在线支付
- 格式:doc
- 大小:65.50 KB
- 文档页数:6
java支付宝支付原理
支付宝是阿里巴巴集团旗下的第三方支付平台,由此应运而生的Java支付宝支付,是基于Java语言编写的支付宝支付SDK的一种实现方式。
Java支付宝支付的原理,主要是通过传输加密的HTTP协议,将用户支付信息传输到支付宝的支付网关,然后由支付网关将支付信息传递给用户选定的银行,完成支付过程。
在Java支付宝支付的过程中,首先需要调用支付宝的统一下单API接口,生成预支付订单。
对于预支付订单的生成,需要对订单中的参数进行签名、加密等操作,保障支付过程的安全性,同时也需要传递用户的支付信息,包括订单号、订单金额、用户ID等参数,确保做好支付信息的校验及保密工作。
完成预支付订单的生成后,接下来就是处理支付操作了。
在Java支付宝支付中,用户需要将付款方式和支付密码等信息输入到支付宝的付款界面中,再由用户进行确认和授权操作。
在授权是,支付宝会发回一个交易流水号,Java服务端需要通过这个交易流水号来查询支付结果。
在Java支付宝支付完成后,支付成功或失败的信息会被及时的传回给Java服务端。
对于支付失败或者出现异常的情况,Java服务端需要及时进行处理,以完成支付过程的性能和安全性。
总的来说,Java支付宝支付的原理,是通过Java实现支付宝支付的业务流程,实现了对于支付过程的管理和控制,为用户提供了快捷、方便、安全的支付服务。
同时,Java 支付宝支付也为商家提供了更广泛的销售渠道和实现订单支付的途径,为企业创造了更多的商机。
微信⽀付java版(含视频讲解)1.背景实际开发中⽤到微信⽀付的概率⾮常⼤,⾄于为什么这⾥不必要我多少......微信⽀付⼤体需要对接的核⼼接⼝有其实⼤部分⽀付都是这些,就像上⼀节我们讲的⽀付宝⽀付⼀样这⾥以常⽤的H5⽀付为例,其他的都是差不多的....值得注意的时候,微信⽀付最常⽤的就是H5⽀付和JSAPI⽀付,这两者的主要区别在于H5⽀付必须在⾮微信浏览器打开;JSAPI⽀付只能在微信的浏览器打开;1.统⼀下单2.查询订单3.⽀付结果通知4.申请退款5.查询退款6.下载对账单2.需要准备的环境微信⽀付⽬前还没有沙箱测试环境,要开开发⽀付功能必须要有企业资质申请公众号和商户号才可以主要的是:公众号appid商户号商户号的apiSercet密码商户号的证书商户号上绑定好的回调域名3.开发步骤3.1.统⼀下单代码如下:package er.service.impl;import cn.hutool.core.date.DateUtil;import cn.hutool.core.util.NumberUtil;import cn.hutool.core.util.RandomUtil;import cn.hutool.core.util.StrUtil;import cn.hutool.http.HttpUtil;import com.alibaba.fastjson.JSON;import mon.constant.PayConstant;import mon.constant.PayEnum;import mon.constant.TestData;import mon.constant.WeChatConstant;import mon.exception.ParamException;import mon.exception.WeChatException;import mon.util.wechat.WXPayUtil;import er.entity.bo.PayBO;import er.entity.vo.PayVO;import er.service.IPayService;import lombok.extern.slf4j.Slf4j;import org.springframework.stereotype.Service;import java.util.Date;import java.util.HashMap;import java.util.Map;/*** @Copyright (C) XXXXXX科技股份技有限公司* @Author: lidongping* @Date: 2021-01-07 18:47* @Description:*/@Service@Slf4jpublic class WeChatPayService implements IPayService {@Overridepublic String getPayType() {return PayConstant.WECHAT;}@Overridepublic PayVO getPayInfo(PayBO payBO) throws Exception {// 根据订单号查询订单数据和⽀付账号数据// 这⾥测试直接将数据写在代码⾥payBO.setAppId(TestData.WX_APP_ID).setMerchantId(TestData.WX_MERCHANT_ID).setApiSecretKey(TestData.WX_SECRET).setPayTitle("测试⽀付").setPayMoney(0.01).setProductNo("P001").setAsynchronousNotifyUrl("/api/async/wechat/payment").setOpenId("ozwLvwah3xtA93csvZTWr0wON_IU");// 以下是封装微信⽀付数据Map dic = new HashMap<String, String>();dic.put("appid", payBO.getAppId());dic.put("mch_id", payBO.getMerchantId());String nonceStr = RandomUtil.randomString(30);dic.put("nonce_str", nonceStr);dic.put("body", payBO.getPayTitle());dic.put("out_trade_no", payBO.getOrderNo());String amount = NumberUtil.roundStr(payBO.getPayMoney() * 100, 0);dic.put("total_fee", amount);dic.put("spbill_create_ip", payBO.getUserIp());dic.put("notify_url", payBO.getAsynchronousNotifyUrl());// ⽣成的⽀付信息⼀⼩时内有效dic.put("time_expire", DateUtil.format(DateUtil.offsetHour(new Date(), 1), "yyyyMMddHHmmss"));// 根据类型请求⽀付PayEnum payType = PayEnum.valueOf(payBO.getPayType());switch (payType) {case WECHAT_QR:dic.put("trade_type", "NATIVE");dic.put("product_id", payBO.getProductNo());break;case WECHAT_JSAPI:dic.put("trade_type", "JSAPI");if (StrUtil.isEmpty(payBO.getOpenId())) {throw new ParamException("openid 为空");}dic.put("openid", payBO.getOpenId());break;case WECHAT_H5:dic.put("trade_type", "MWEB");break;default:throw new ParamException("没有对应的⽀付⽅式");}("签名前:" + JSON.toJSONString(dic));dic.put("sign", WXPayUtil.generateSignature(dic, payBO.getApiSecretKey()));String dataXml = WXPayUtil.mapToXml(dic);("微信请求下单url:" + WeChatConstant.PAY_URL);("微信请求下单参数:" + dataXml);String resp = HttpUtil.post(WeChatConstant.PAY_URL, dataXml, 60 * 1000);("微信请求下单返回:" + resp);Map<String, String> resMap = WXPayUtil.xmlToMap(resp);// 请求失败if (!resMap.get("return_code").equalsIgnoreCase(WeChatConstant.SUCCESS)) {throw new WeChatException(resMap.get("return_msg"));}// 下单失败if (!resMap.get("result_code").equalsIgnoreCase(WeChatConstant.SUCCESS)) {throw new WeChatException(resMap.get("err_code_des"));}// 校验⽀付返回结果签名if (!checkSign(resMap, payBO.getApiSecretKey())) {throw new WeChatException("验证签名失败");}// 处理返回结果PayVO payVO = new PayVO();payVO.setOrderNo(payBO.getOrderNo());switch (payType) {case WECHAT_QR:payVO.setPayInfo(resMap.get("code_url"));break;case WECHAT_JSAPI:Map jsapi = new HashMap<String, String>();jsapi.put("appId", payBO.getAppId());// 当前时间秒jsapi.put("timeStamp", System.currentTimeMillis() / 1000 + "");jsapi.put("nonceStr", nonceStr);jsapi.put("package", "prepay_id=" + resMap.get("prepay_id"));jsapi.put("signType", "MD5");jsapi.put("paySign", WXPayUtil.generateSignature(jsapi, payBO.getApiSecretKey()));payVO.setPayInfo(jsapi);break;default:payVO.setPayInfo(resMap.get("mweb_url"));}return payVO;}/*** 微信响应数据签名检查** @param map* @param key* @return* @throws Exception*/private static boolean checkSign(Map<String, String> map, String key) throws Exception {String sign = map.get("sign");map.remove("sign");String orign = WXPayUtil.generateSignature(map, key);return orign.equalsIgnoreCase(sign);}}View Code3.2.异步通知代码如下:package er.controller;import cn.hutool.extra.servlet.ServletUtil;import com.alibaba.fastjson.JSON;import mon.constant.TestData;import mon.constant.WeChatConstant;import mon.util.RedisUtil;import mon.util.wechat.WXPayUtil;import lombok.extern.slf4j.Slf4j;import org.springframework.web.bind.annotation.PostMapping;import org.springframework.web.bind.annotation.RestController;import javax.servlet.http.HttpServletRequest;import java.util.Map;/*** @author姿势帝-博客园* @address https:///newAndHui/* @WeChat 851298348* @create 01/10 11:18* @description*/@RestController@Slf4jpublic class WeChatController {/*** 注意:* 1.这⾥是只⽀付宝微信xml的参数接收,微信最近也提供了json的⽅式,本质上都是⼀样的* 2.xml参数回调⽂档:https:///wiki/doc/api/H5.php?chapter=9_7&index=8** @param request* @return* @throws Exception*/@PostMapping("/async/wechat/payment")public String notifyPaymentResult(HttpServletRequest request) throws Exception {("wechat异步回调....");String paramXml = ServletUtil.getBody(request);Map<String, String> paramsMap = WXPayUtil.xmlToMap(paramXml);//解析参数String returnCode = paramsMap.get("return_code");String tradeStatus = paramsMap.get("result_code");String appid = paramsMap.get("appid");String totalFee = paramsMap.get("total_fee");String orderNo = paramsMap.get("out_trade_no");if (!WeChatConstant.SUCCESS.equals(returnCode)) {log.error("回调状态错误:returnCode={}", returnCode);return WeChatConstant.RETURN_FAIL;}// TODO 这⾥实际开发时根据订单号获取apiSecret秘钥String apiSecret = TestData.WX_SECRET;// 验签if (!WXPayUtil.isSignatureValid(paramsMap, apiSecret)) {log.error("验签失败");return WeChatConstant.RETURN_FAIL;}if (!WeChatConstant.SUCCESS.equals(tradeStatus)) {log.error("⽀付状态失败:tradeStatus={}", tradeStatus);return WeChatConstant.RETURN_FAIL;}// TODO 更新数据库订单数据和缓存 ... 这⾥略// 这⾥只是模拟⽅放⼊缓存,便于前端查询订单 60 * 60 * 2L 表⽰缓存2⼩时RedisUtil.set(orderNo, JSON.toJSON(paramsMap), 60 * 60 * 2L);("异步处理成功.............");return WeChatConstant.RETURN_SUCCESS;}}View Code3.3.测试获取微信⽀付信息@Testvoid getPayInfo() {String url = urlLocal + "/userOrder/payInfo";System.out.println("请求地址:" + url);HttpRequest request = HttpUtil.createRequest(Method.GET, url);Map<String, Object> map = new HashMap<>();map.put("orderNo", "NO" + System.currentTimeMillis());// 微信⽀付 wechat ⽀付宝 alipaymap.put("payCategory", "wechat");// 201 jsapi⽀付 , 202 微信H5 101⽀付宝H5map.put("payType", "202");request.form(map);System.out.println("请求参数:" + map);request.header("X-Real_IP", "192.168.5.195");request.setConnectionTimeout(60 * 1000);String respone = request.execute().body();System.out.println("响应结果:" + respone);}View Code测试结果请求地址:http://localhost:8080/api/userOrder/payInfo请求参数:{payCategory=wechat, orderNo=NO1610250837438, payType=202}响应结果:{"message":"success","code":100,"data":{"orderNo":"NO1610250837438","payInfo":"https:///cgi-bin/mmpayweb-bin/checkmweb?prepay_id=wx10115509234051b333adbe01d032b80000&package=2821154835"}}从响应的结果看,我们已经拿到了payInfo,也就是跳转到微信的url正常情况下,只要在⾮微信浏览器打开就可以了,但是微信那边对请求来源的域名做了校验,我们这⾥测试不是很⽅便,就不继续演⽰下去了因为实际开发中只要⾛到这⼀步,对于开发⼈员来说代码就已经合格了,如果只会⽀付不了,那多半是微信商户号上的配置有问题....学习我们就到这⾥,如果在实际开发中有问题可以咨询我,共同交流技术!4.总结1.这⾥只是给⼤家演⽰了统⼀下单和⽀付回调的代码,也是微信⽀付的核⼼代码,相信只要这调通了,其他的接⼝类似!2.为了更好让⼤家快速掌握微信⽀付,这篇博客已经做了配套的视频讲解,⼤家可以结合视频讲解学习,或者单独问我!完美!。
java海外支付对接流程
对接海外支付的流程主要取决于具体的支付平台和地区,但一般来说,大致的步骤如下:
1. 选择支付平台:首先,你需要选择一个适合你的业务需求和目标市场的支付平台。
这可能包括信用卡支付网关、银行转账系统、第三方支付平台等。
2. 注册和认证:前往所选支付平台的官网进行注册,并根据平台要求提供必要的信息和文档进行认证。
这通常包括公司资料、税务信息、银行账户信息等。
3. 集成支付网关:一旦你完成了注册和认证,你将被提供一段用于集成的代码或SDK。
你需要将这些代码集成到你的网站或应用中,以实现支付功能。
4. 处理支付:当用户在你的网站或应用中选择支付时,你的系统将与支付平台的系统进行通信,处理用户的支付请求。
你需要确保你的系统能够正确地处理支付请求,包括验证用户信息、处理支付金额和币种等。
5. 处理退款和争议:在处理支付时,可能会出现退款或争议的情况。
你需要与支付平台协商好退款和争议的处理流程,以确保用户和你的权益得到保障。
6. 分析交易数据:为了更好地了解你的业务情况和优化支付流程,你需要定期分析交易数据。
这包括交易金额、交易成功率、退款率等指标。
7. 维护和更新:随着业务的发展和技术的更新,你可能需要定期更新和调整你的支付系统。
你需要保持与支付平台的联系,及时了解最新的支付技术和政策变化。
以上是一个大致的流程,具体步骤可能会因不同的支付平台和地区而有所不同。
在对接海外支付时,建议你详细阅读所选支付平台的文档,并与他们的客户支持团队保持密切联系,以确保你的支付流程顺利运行。
基于JAVA语言的在线购物系统的设计与实现第1章设计背景1.1电商背景20世纪90年代以来,随着网络、电信和信息技术领域的迅速发展,互联网在世界各地的爆炸和迅速扩散是可以观察到的。
从这一点出发,电子商务应运而生。
用电子公司基于一种全新的基于互联网的业务模式,这种模式既包括事务性使用,也包括在银行中使用电子付款和客户数据,从而使公司更接近供应商。
联系您的公司,让他们更快地了解您客户的需求,并选择世界上最好的供应商在全球市场销售您的产品。
电子商务自1998年以来已经完成Shar发展迅速,每九个月的销售额增长到全球电子商务销售额上千亿美元(包括互联网贸易量、销售额等)翻了一番,电子商务收入猛增262%。
当前,世界各国对电子商务的新面貌持乐观态度。
总体而言,电子商务的发展将成为今后25年世界经济发展的主要动力之一,并对经济发展作出更大贡献。
网络经济评价知名专家罗伯特·梅卡费说:“互联网的价值等于点数的平方相关。
”1第2章系统分析2.1可用性分析由于现如今网络几乎已经遍布世界的每一个角落,同时又为了方便用户随时随地使用本系统,从安全性、成本等各方面考虑网上购物系统采用BS结构可以很好的实现各方面的功能。
2.2C/S与B/S架构CS(Client/Server):客户机/服务器结构C/S结构在技术上得到了证明,主要特性是高交互、安全访问模式、低网络流量、快速响应时间,客户端负责业务逻辑和用户界面演示,因此可以处理大量数据。
因此,它负责大多数业务逻辑和UI演示。
此客户端(也称为粗体客户端)在两端使用硬件,并在客户端和服务器的两端分配任务。
降低系统通信成本结构化C/S软件对不同的操作系统需要不同版本的软件,快速的产品更新使客户难以在用户计算机上运行的数百台计算机C/S体系结构中同时适应局域网用户,是具有1个或2个以上程序的典型两层体系结构。
服务器端应用程序有两种类型:客户端访问服务器端数据的数据库服务器端,另一种是服务器端应用程序通过套接字与客户端应用程序通信的套接字服务器端。
Java与移动支付构建安全和便捷的支付解决方案移动支付是近年来快速发展的一种支付方式,随着智能手机的普及和移动互联网的快速发展,移动支付正在逐渐取代传统的现金支付方式。
为了确保移动支付的安全性和方便性,Java技术在移动支付领域扮演着重要的角色。
本文将从安全和便捷两个方面来探讨Java与移动支付的结合构建安全和便捷的支付解决方案。
一、安全性在移动支付中,安全性是最基本的要求。
用户需要确保自己的支付信息不被盗取或篡改。
Java技术凭借其强大的安全特性,为移动支付提供了可靠的保障。
1. 数据加密Java的加密技术可以有效地保护支付数据的安全。
在传输过程中,支付数据会被加密,确保黑客无法窃取用户的敏感信息。
同时,Java 提供了多种加密算法,如AES、RSA等,可以根据实际需求选择最适合的加密方式。
2. 安全检测Java技术可以对移动支付过程中的安全问题进行检测和防范。
通过对代码的静态和动态分析,可以检测出潜在的安全漏洞,并及时采取相应的措施加以修复。
Java的安全检测机制可以有效地减少支付过程中的风险。
3. 数字证书移动支付中的身份验证是保障支付安全的重要环节。
Java技术支持使用数字证书进行双方身份验证,确保交易双方的真实性和可信度。
通过数字证书,支付方和接收方可以互相验证身份,从而减少支付中的风险。
二、便捷性移动支付最大的优势之一就是便捷性。
用户只需要一部智能手机和一个移动支付应用,就可以随时随地进行支付。
而Java技术的灵活性和跨平台特性,为用户提供了更加便捷的支付体验。
1. 跨平台支持Java技术具有跨平台的特点,能够在不同操作系统和设备上运行。
这意味着用户可以使用Java编写的移动支付应用,在不同的智能手机上进行支付操作,无需担心兼容性问题。
Java的跨平台支持大大提升了移动支付的便捷性。
2. 用户界面设计Java技术提供了丰富的图形化界面工具包,如Swing和JavaFX,可以帮助开发者设计出美观、易用的移动支付应用。
Java利⽤沙箱⽀付实现电脑扫码⽀付教程⽬录⼀、准备⼯作⼆、效果展⽰三、实现代码3.1 后台代码3.2 前台代码⼀、准备⼯作1、注册⽀付宝开放平台账号,成为开发者。
2、进⼊沙箱,进⾏配置。
3.我们可以看到这个界⾯4.后⾯需要使⽤的参数APPID商户私钥(使⽤系统默认密钥的公钥模式,点击查看获取)⽀付宝公钥⽀付宝⽹关5、⼿机上下载沙箱⽀付宝(到时候⽀付⽤这个⽀付宝⽀付)6、下载好⽀付宝沙箱版后,登录⽀付宝提供的账号⼆、效果展⽰1、随⼿写的⼀个前台vue界⾯2、进⼊确定订单界⾯,可以添加商品描述3、跳转⽀付界⾯,利⽤沙箱⽀付宝完成⽀付4、完成⽀付5、跳回⾃⼰设置的界⾯三、实现代码3.1 后台代码(我这⾥利⽤的是SpringBoot集成的SSM,当然不使⽤SpringBoot也可以)3.1.1 pom.xml⽂件不⽤全部的,重点是:⽀付宝sdk包、fastjson<?xml version="1.0" encoding="UTF-8"?><project xmlns="/POM/4.0.0" xmlns:xsi="/2001/XMLSchema-instance"xsi:schemaLocation="/POM/4.0.0 https:///xsd/maven-4.0.0.xsd"><modelVersion>4.0.0</modelVersion><groupId>com.zking</groupId><artifactId>springboot02</artifactId><version>0.0.1-SNAPSHOT</version><name>springboot02</name><description>Demo project for Spring Boot</description><properties><java.version>1.8</java.version><project.build.sourceEncoding>UTF-8</project.build.sourceEncoding><project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding><spring-boot.version>2.1.18.RELEASE</spring-boot.version></properties><dependencies><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-jdbc</artifactId></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId></dependency><dependency><groupId>org.mybatis.spring.boot</groupId><artifactId>mybatis-spring-boot-starter</artifactId><version>2.1.4</version></dependency><dependency><groupId>mysql</groupId><artifactId>mysql-connector-java</artifactId><version>5.1.44</version><scope>runtime</scope></dependency><dependency><groupId>org.projectlombok</groupId><artifactId>lombok</artifactId><optional>true</optional></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-test</artifactId><scope>test</scope></dependency><dependency><groupId>org.junit.jupiter</groupId><artifactId>junit-jupiter</artifactId><version>RELEASE</version><scope>test</scope></dependency><dependency><groupId>com.github.pagehelper</groupId><artifactId>pagehelper-spring-boot-starter</artifactId><version>1.4.1</version></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-aop</artifactId><version>2.6.2</version></dependency><!-- ⽀付宝sdk包 --><dependency><groupId>com.alipay.sdk</groupId><artifactId>alipay-sdk-java</artifactId><version>3.1.0</version></dependency><!-- fastjson --><dependency><groupId>com.alibaba</groupId><artifactId>fastjson</artifactId><version>1.2.48</version></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-data-redis</artifactId></dependency><!-- https:///artifact/com.alibaba/druid --><dependency><groupId>com.alibaba</groupId><artifactId>druid</artifactId><version>1.2.6</version></dependency><!-- https:///artifact/log4j/log4j --><dependency><groupId>log4j</groupId><artifactId>log4j</artifactId><version>1.2.17</version></dependency></dependencies><dependencyManagement><dependencies><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-dependencies</artifactId><version>${spring-boot.version}</version><type>pom</type><scope>import</scope></dependency></dependencies></dependencyManagement><build><plugins><plugin><groupId>org.apache.maven.plugins</groupId><artifactId>maven-compiler-plugin</artifactId><version>3.8.1</version><configuration><source>1.8</source><target>1.8</target><encoding>UTF-8</encoding></configuration></plugin><!-- mvn mybatis-generator:generate --><plugin><groupId>org.mybatis.generator</groupId><artifactId>mybatis-generator-maven-plugin</artifactId><version>1.3.2</version><configuration><verbose>true</verbose><overwrite>true</overwrite><!--配置⽂件的位置--><configurationFile>src/main/resources/generatorConfig.xml</configurationFile> </configuration></plugin><plugin><groupId>org.springframework.boot</groupId><artifactId>spring-boot-maven-plugin</artifactId><version>2.1.18.RELEASE</version><configuration><mainClass>com.zking.springboot02.Springboot02Application</mainClass> </configuration><executions><execution><id>repackage</id><goals><goal>repackage</goal></goals></execution></executions></plugin></plugins></build></project>3.1.2 model包package com.zking.springboot02.model;import lombok.Data;/*** ⽀付实体对象* 根据⽀付宝接⼝协议,其中的属性名,必须使⽤下划线,不能修改** @author 借我丹青妙笔*/@Datapublic class AlipayBean {private static final long serialVersionUID = 1L;/*** 商户订单号,必填**/private String out_trade_no;/*** 订单名称,必填*/private String subject;/*** 付款⾦额,必填* 根据⽀付宝接⼝协议,必须使⽤下划线*/private String total_amount;/*** 商品描述,可空*/private String body;/*** 超时时间参数*/private String timeout_express= "10m";/*** 产品编号*/private String product_code= "FAST_INSTANT_TRADE_PAY";public String getOut_trade_no() {return out_trade_no;}public void setOut_trade_no(String out_trade_no) {this.out_trade_no = out_trade_no;}public String getSubject() {return subject;}public void setSubject(String subject) {this.subject = subject;}public String getTotal_amount() {return total_amount;}public void setTotal_amount(String total_amount) {this.total_amount = total_amount;}public String getBody() {return body;}public void setBody(String body) {this.body = body;}}3.1.3 utils包AlipayConfig类(请配置好该类,防⽌报错)1. appId:APPID,沙箱应⽤提供的2. privateKey: 商户私钥,点击公钥证书查看3. returnUrl : ⽀付完成后跳转的页⾯,例如我填的是:http://localhost:8088/package com.zking.springboot02.utils;import lombok.Data;import org.springframework.context.annotation.Configuration;import org.springframework.context.annotation.PropertySource;import ponent;/*** 配置⽂件读取**/@Configuration@Data@Componentpublic class AlipayConfig {/*** 应⽤ID,您的APPID,收款账号既是您的APPID对应⽀付宝账号*/private String appId = "";/*** 商户私钥,您的PKCS8格式RSA2私钥*/private String privateKey = "";/*** ⽀付宝公钥,*/private String publicKey = "MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAyqAN9WzWigim0/3fBK97RFZ7Juu31+DfXMVHTHSTP+4WPvr80zTiIQmT9xTFVGBgD8BBX0XELxqLQxsYQm/MgEgccHTnCKPP7Ci979YuwZyjOysdTc6BNO/6RqPZruih /*** 服务器异步通知页⾯路径需http://格式的完整路径,不能加?id=123这类⾃定义参数*/private String notifyUrl = "https://www.duan33f.top";/*** 页⾯跳转同步通知页⾯路径需http://格式的完整路径.* ⽀付完成后返回的地址*/private String returnUrl = "";/*** 签名⽅式*/private String signType = "RSA2";/*** 字符编码格式*/private String charset = "utf-8";/*** ⽀付宝⽹关*/private String gatewayUrl = "https:///gateway.do";/*** ⽀付宝⽹关*/private String logPath = "C:\\";}Alipay类package com.zking.springboot02.utils;import com.alibaba.fastjson.JSON;import com.alipay.api.AlipayApiException;import com.alipay.api.AlipayClient;import com.alipay.api.DefaultAlipayClient;import com.alipay.api.request.AlipayTradePagePayRequest;import com.zking.springboot02.model.AlipayBean;import org.springframework.beans.factory.annotation.Autowired;import ponent;import javax.annotation.Resource;/*** ⽀付宝⽀付接⼝* @author 借我丹青妙笔*/@Componentpublic class Alipay {@Autowiredprivate AlipayConfig alipayConfig;/*** ⽀付接⼝* @param alipayBean* @return* @throws AlipayApiException*/public String pay(AlipayBean alipayBean) throws AlipayApiException {// 1、获得初始化的AlipayClientString serverUrl = alipayConfig.getGatewayUrl();String appId = alipayConfig.getAppId();String privateKey = alipayConfig.getPrivateKey();String format = "json";String charset = alipayConfig.getCharset();String alipayPublicKey = alipayConfig.getPublicKey();String signType = alipayConfig.getSignType();String returnUrl = alipayConfig.getReturnUrl();String notifyUrl = alipayConfig.getNotifyUrl();//System.out.println(appId);AlipayClient alipayClient = new DefaultAlipayClient(serverUrl, appId, privateKey, format, charset, alipayPublicKey, signType); // 2、设置请求参数AlipayTradePagePayRequest alipayRequest = new AlipayTradePagePayRequest();// 页⾯跳转同步通知页⾯路径alipayRequest.setReturnUrl(returnUrl);// 服务器异步通知页⾯路径alipayRequest.setNotifyUrl(notifyUrl);// 封装参数alipayRequest.setBizContent(JSON.toJSONString(alipayBean));// 3、请求⽀付宝进⾏付款,并获取⽀付结果String result = alipayClient.pageExecute(alipayRequest).getBody();// 返回付款信息return result;}}3.1.4 Service包PayService接⼝package com.zking.springboot02.service;import com.alipay.api.AlipayApiException;import com.zking.springboot02.model.AlipayBean;/*** ⽀付服务* @author 借我丹青妙笔* @date Dec 12, 2018*/public interface PayService {/*** ⽀付宝⽀付接⼝* @param alipayBean* @return* @throws AlipayApiException*/String aliPay(AlipayBean alipayBean) throws AlipayApiException;}PayServiceImpl类package com.zking.springboot02.service.impl;import com.alipay.api.AlipayApiException;import com.zking.springboot02.model.AlipayBean;import com.zking.springboot02.service.PayService;import com.zking.springboot02.utils.Alipay;import org.springframework.stereotype.Service;import javax.annotation.Resource;@Servicepublic class PayServiceImpl implements PayService {@Resourceprivate Alipay alipay;@Overridepublic String aliPay(AlipayBean alipayBean) throws AlipayApiException {return alipay.pay(alipayBean);}}3.1.5 contorller包payController类package com.zking.springboot02.contorller;import com.alipay.api.AlipayApiException;import com.zking.springboot02.model.AlipayBean;import com.zking.springboot02.service.PayService;import org.springframework.web.bind.annotation.CrossOrigin;import org.springframework.web.bind.annotation.PostMapping;import org.springframework.web.bind.annotation.RequestMapping;import org.springframework.web.bind.annotation.RestController;import javax.annotation.Resource;import java.util.HashMap;import java.util.Map;@RestController@RequestMapping("/pay")@CrossOriginpublic class PayController {@Resourceprivate PayService payService;/*** 阿⾥⽀付* @param alipayBean* @return* @throws AlipayApiException*/@PostMapping("/alipay")public Map alipay(AlipayBean alipayBean) throws AlipayApiException {System.out.println(alipayBean);Map<String,Object> map = new HashMap<String,Object>();String str = payService.aliPay(alipayBean);System.out.println(str);map.put("msg",str);map.put("code",0);//return map;}}3.1.6 application.yml⽂件server:port: 8080 #端⼝号servlet:context-path: /s02 #项⽬名3.2 前台代码(前台是利⽤脚⼿架搭建的Vue项⽬)3.2.1 src下api包下action.js⽂件/*** 对后台请求的地址的封装,URL格式如下:* 模块名_实体名_操作*/export default {//服务器'SERVER': 'http://localhost:8080/s02','alipay' : 'http://localhost:8080/s02/pay/alipay',//获得请求的完整地址,⽤于mockjs测试时使⽤'getFullPath': k => {return this.SERVER + this[k];}}3.2.2 src下api包下http.js⽂件/*** vue项⽬对axios的全局配置*/import axios from 'axios'import qs from 'qs'//引⼊action模块,并添加⾄axios的类属性urls上import action from '@/api/action'axios.urls = action// axios默认配置axios.defaults.timeout = 10000; // 超时时间// axios.defaults.baseURL = 'http://localhost:8080/crm'; // 默认地址axios.defaults.baseURL = action.SERVER;//整理数据// 只适⽤于 POST,PUT,PATCH,transformRequest` 允许在向服务器发送前,修改请求数据axios.defaults.transformRequest = function(data) {data = qs.stringify(data);return data;};// 请求拦截器e(function(config) {// let jwt = sessionStorage.getItem('jwt');// if (jwt) {// config.headers['jwt'] = jwt;// }return config;}, function(error) {return Promise.reject(error);});// 响应拦截器e(function(response) {return response;}, function(error) {return Promise.reject(error);});export default axios;3.2.3 src下router下index.js⽂件import Vue from 'vue'import Router from 'vue-router'import Shop from '@/views/Shop'import buy from '@/views/buy'e(Router)export default new Router({routes: [{path: '/',name: 'Shop',component: Shop},{path: '/buy',name: 'buy',component: buy}]})3.2.4 src下views下Shop.vue⽂件<template><el-table :data="tableData" style="width: 100%"><el-table-column prop="out_trade_no" label="编号"></el-table-column><el-table-column prop="subject" label="订单名称" ></el-table-column><el-table-column prop="total_amount" label="付款⾦额"></el-table-column><el-table-column label="操作"><template slot-scope="scope"><el-button @click="toBuy(scope.row)" type="text" size="small">去⽀付</el-button> </template></el-table-column></el-table></template><script>export default {name: "Shop",data: function() {return {tableData: [{out_trade_no: '101',subject: 'Java从⼊门到⼊⼟',total_amount: 33}, {out_trade_no: '202',subject: 'Mysql删库跑路指南',total_amount: 44}, {out_trade_no: '303',subject: 'Java编程思想',total_amount: 89}, {out_trade_no: '404',subject: 'Java设计模式',total_amount: 56}]};},methods: {toBuy(row){console.log(row);//利⽤$router.push进⾏跳转this.$router.push({//path后⾯跟跳转的路由地址path: '/buy',//name后⾯跟跳转的路由名字(必须有亲测,不使⽤命名路由会传参失败)name: 'buy',params: {//imgsListsUrl2是⾃⼰定义的名字,this.imgsListsUrl是要被传递的值payInfo: row}})}},created: function() {}}</script><style></style>3.2.5 src下views下buy.vue⽂件<template><div class="main"><center><div class="box"><h2>确定订单</h2><el-form :model="payInfo" :rules="rules" ref="ruleForm" label-width="100px" class="demo-ruleForm"><el-form-item label="订单号" prop="out_trade_no"><el-input v-model="payInfo.out_trade_no" readonly="true"></el-input></el-form-item><el-form-item label="商品名称" prop="subject"><el-input v-model="payInfo.subject" readonly="true"></el-input></el-form-item><el-form-item label="商品价格" prop="total_amount"><el-input v-model="payInfo.total_amount" readonly="true"></el-input></el-form-item><el-form-item label="商品描述" prop="body"><el-input v-model="payInfo.body"></el-input></el-form-item><el-button type="primary" plain @click="submit" style="width: 100%;" round>付款</el-button></el-form></div></center></div></template><script>//import axios from 'axios'export default {name: "buy",data() {return {payInfo: {out_trade_no: '',subject: '',total_amount: null,body: ''}}},mounted() {//this.$route.params.imgsListsUrl2是传过来的参数var time = new Date();this.payInfo = this.$route.params.payInfothis.payInfo.out_trade_no = time.getTime();},methods: {submit() {var url = this.axios.urls.alipay;//得到api下action.js中的alipaythis.axios.post(url, this.payInfo).then(resp => {//调⽤后台⽅法console.log(resp);const divForm = document.getElementsByTagName('div')if (divForm.length) {document.body.removeChild(divForm[0])}const div = document.createElement('div')div.innerHTML = resp.data.msg // data就是接⼝返回的form 表单字符串document.body.appendChild(div)document.forms[0].setAttribute('target', '_blank') // 新开窗⼝跳转document.forms[0].submit()}).catch(resp => {console.log(resp);});}}}</script><style scoped>.box {width: 800px;}.left {width: 85px;padding-top: 5px;font-size: 15px;}.right {width: 400px;}</style>3.2.6 src下main.js⽂件import Vue from 'vue'import ElementUI from 'element-ui' //新添加1import 'element-ui/lib/theme-chalk/index.css' //新添加2,避免后期打包样式不同,要放在import App from './App';之前import axios from '@/api/http' //vue项⽬对axios的全局配置import App from './App'import router from './router'import VueAxios from 'vue-axios'e(VueAxios,axios)e(ElementUI) //新添加3Vue.config.productionTip = false/* eslint-disable no-new */new Vue({el: '#app',router,components: { App },template: '<App/>'})OK,重要的代码已经完全提供了。
Java后台实现微信⽀付和微信退款微信⽀付流程都是我⾃⼰⼯作中开发的,亲测可⽤,不喜勿喷。
controller中我是这么写的,你们需要根据⾃⼰的业务需求改动。
ResponseBean是我⾃⼰封装的,你们可以改成你们想要的形式。
/*** 微信统⼀下单接⼝* @return*/@RequestMapping(value = "/doUnifiedOrder", method = RequestMethod.POST)public ResponseBean doUnifiedOrder(@RequestBody Map<String,Object> req) {Map resultMap=new HashMap();String openid = (String) req.get("openId");WXPay wxpay =null;try {//初始化证书myConfig.initCert();wxpay= new WXPay(myConfig);} catch (Exception e) {e.printStackTrace();}//⽣成的随机字符串String nonce_str = WXPayUtil.generateNonceStr();//获取客户端的ip地址//获取本机的ip地址InetAddress addr = null;try {addr = InetAddress.getLocalHost();} catch (UnknownHostException e) {e.printStackTrace();}//⽀付⾦额,需要转成字符串类型,否则后⾯的签名会失败String payOutMoney = WxMoney.changeY2F(String.valueOf(req.get("money")));String tradeName = (String) req.get("tradeName");if(tradeName!=null&&tradeName.length()>0){}else{tradeName = "课程⽀付";}String body = tradeName;//商户订单号String out_trade_no= WXPayUtil.generateNonceStr();//统⼀下单接⼝参数HashMap<String, String> data = new HashMap<String, String>();data.put("appid", 你的appid);data.put("mch_id", 商户id);data.put("nonce_str", nonce_str);data.put("body", body);data.put("out_trade_no",out_trade_no);data.put("total_fee", payOutMoney);data.put("spbill_create_ip", "127.0.0.1");data.put("notify_url", 回调地址);data.put("trade_type","JSAPI");data.put("openid", openid);try {Map<String, String> rMap = wxpay.unifiedOrder(data);String return_code = (String) rMap.get("return_code");String result_code = (String) rMap.get("result_code");String nonceStr = WXPayUtil.generateNonceStr();resultMap.put("nonceStr", nonceStr);Long timeStamp = System.currentTimeMillis() / 1000;if ("SUCCESS".equals(return_code) && return_code.equals(result_code)) {String prepayid = rMap.get("prepay_id");resultMap.put("package", "prepay_id="+prepayid);resultMap.put("signType", "MD5");//这边要将返回的时间戳转化成字符串,不然⼩程序端调⽤wx.requestPayment⽅法会报签名错误resultMap.put("timeStamp", timeStamp + "");//再次签名,这个签名⽤于⼩程序端调⽤wx.requesetPayment⽅法resultMap.put("appId",myConfig.getAppID());String sign = WXPayUtil.generateSignature(resultMap, myConfig.getKey());resultMap.put("paySign", sign);resultMap.put("out_trade_no",out_trade_no);ResponseBean responseBean = new ResponseBean(HttpStatus.OK.value(),"微信⽀付",resultMap);return responseBean;}else{ResponseBean responseBean = new ResponseBean(HttpStatus.OK.value(),"微信⽀付失败","微信⽀付失败");return responseBean;}} catch (Exception e) {ResponseBean responseBean = new ResponseBean(HttpStatus.OK.value(),"微信⽀付失败","微信⽀付失败");e.printStackTrace();return responseBean;}}微信退款代码(需要传退款的订单id)public ResponseBean refund(Map<String, Object> req) {Map resultMap=new HashMap();String buyId = (String) req.get("buyId");WXPay wxpay =null;try {myConfig.initCert();//初始化证书wxpay= new WXPay(myConfig);} catch (Exception e) {e.printStackTrace();}//⽣成的随机字符串String nonce_str = WXPayUtil.generateNonceStr();//获取客户端的ip地址//获取本机的ip地址InetAddress addr = null;try {addr = InetAddress.getLocalHost();} catch (UnknownHostException e) {e.printStackTrace();}//⽀付⾦额,需要转成字符串类型,否则后⾯的签名会失败// int total_fee= (int) req.get("money");String payOutMoney = WxMoney.changeY2F(String.valueOf(req.get("money")));// String body = (String) req.get("z");//商户订单号String out_trade_no= WXPayUtil.generateNonceStr();//统⼀下单接⼝参数HashMap<String, String> data = new HashMap<String, String>();try {data.put("appid", myConfig.getAppID());data.put("mch_id", myConfig.getMchID());data.put("nonce_str", nonce_str);data.put("sign_type", "MD5");data.put("out_trade_no",buyId);//微信订单号data.put("out_refund_no", out_trade_no);//商户退款单号data.put("total_fee",payOutMoney);//⽀付⾦额,微信⽀付提交的⾦额是不能带⼩数点的,且是以分为单位,这边需要转成字符串类型,否则后⾯的签名会失败 data.put("refund_fee",payOutMoney);//退款总⾦额,订单总⾦额,单位为分,只能为整数//MD5运算⽣成签名,这⾥是第⼀次签名,⽤于调⽤统⼀下单接⼝String sign = WXPayUtil.generateSignature(data, myConfig.getKey());data.put("sign", sign);Map<String, String> rMap = wxpay.refund(data);String return_code = (String) rMap.get("return_code");String result_code = (String) rMap.get("result_code");Long timeStamp = System.currentTimeMillis() / 1000;if ("SUCCESS".equals(return_code) && return_code.equals(result_code)) {ResponseBean responseBean = new ResponseBean(HttpStatus.OK.value(),"微信退款成功",rMap);return responseBean;}else{ResponseBean responseBean = new ResponseBean(HttpStatus.OK.value(),"微信退款失败","微信⽀付失败");return responseBean;}} catch (Exception e) {ResponseBean responseBean = new ResponseBean(HttpStatus.OK.value(),"微信退款失败","微信⽀付失败");e.printStackTrace();return responseBean;}}需要⽤到的⼯具类然后在MyConfig中配置⼀下你们的⼩程序参数就⾏了,如果需要添加退款功能必须配置商户证书(对应在你项⽬中的位置)。
微信⼩程序-JAVA实现微信⽀付功能(微信⽀付2.0)微信⼩程序-JAVA实现微信⽀付功能(微信⽀付2.0)⼀.前⾔ 本博客主要介绍JAVA后台与微信⼩程序(UNI-APP或者原⽣微信⼩程序)的微信⽀付的实现,如果是APP或者H5的开发暂时不⽀持,具体应⽤场景如下图:不同场景调⽤的微信⽀付接⼝不⼀致,请务必了解,如果您是开发的APP或者H5,请出门右拐(哈哈),此次介绍的微信⽀付是基于⽀付类型为JSAPI实现的,该⽀付⽅式⽀持微信如上图所说的线下场所、公众号、⼩程序、PC⽹站、移动端⽹站,具体以微信⽀付官⽹为主:https:///wiki/doc/apiv3/wxpay/pages/api.shtml,本此开发使⽤的是微信⽀付的V2版,V3版暂未尝试(有兴趣的可以⾃⼰尝试)⼆.开发前准备与要求1.JAVA后台环境准备①.前往https:///wiki/doc/api/jsapi.php?chapter=11_1,下载JAVA版的SDK,该SDK,帮我们实现了许多参数的封装,避免我们⾃⼰拼接微信接⼝的参数,当然如果你有时间也可以⾃⼰拼装,请求参数,具体拼接还是看第⼀幅图上⾯的微信⽀付官⽹。
②.下载好之后解压,然后打开⾥⾥⾯的readme.md⽂件,具体如下该SDK写了很多的⼯具类,我们在开发的时候直接调⽤官⽅提供的SDK就⾏了,然后打开POM.xml⽂件,将这些SDK所需的JAR包引⼊到项⽬中,不然会报错,如果不想使⽤SLFJ⽇志,可以将相关的代码注释,不影响主体功能的使⽤。
然后将解压好的⽂件⾥⾯的java⽂件导⼊到项⽬中去,这⾥笔者就不演⽰了,你可以单独创建⼀个package将这些java⽂件放进去,然后还需要⼀个IpUtil⼯具类,为后⾯的开发做准备,代码⼊下:③.主业务逻辑代码-配置类(******) 先介绍⼀下,下⾯的代码本地JAVA后台代码的核⼼代码,很重要,请认真阅读: 准备⼀个配置类,该类需要继承SDK中的WXPayConfig类,如下,这个配置类⽐较重要,⾥⾯的参数会决定你微信⽀付接⼝调⽤的成功与否。
Java⽀付宝PC⽹站⽀付功能开发(详细教程)⼀、前⾔本案例使⽤的是Java实现的。
使⽤⽀付宝的沙盒环境⽰例。
发布需要换成正式环境。
这⾥就不作详细说明了本代码适合⽤来做参考,不要直接复制去使⽤。
没有账号的需要去平台注册⼀个:找到开发服务中的沙箱点击查看沙箱开发的流程进⼊到沙箱环境中配置相应的信息点击左边的⽣成密钥,密钥长度选择 RSA2 密钥格式选择PKCS8 因为我们使⽤的是Java开发然后点击⽣成密钥然后复制应⽤公钥上传到沙盒环境中应⽤私钥需要⾃⼰保存下来,后⾯有⽤到噢;⽀付宝的东西已经准备好了现在我们开始写代码⼆、Java代码实现本案例使⽤的是Maven项⽬⾸先我们导⼊⽀付宝的 alipay-sdk-java<dependency><groupId>com.alipay.sdk</groupId><artifactId>alipay-sdk-java</artifactId><version>3.0.0</version></dependency>(1)编写⽀付宝配置⽂件package cn.xtyos.project.system.czzx.config;/*** TODO ⽀付宝配置⽂件** @author James* @date 2020/2/9 20:15*/public class AliPayConfig {//应⽤ID,您的APPID,收款账号既是您的APPID对应⽀付宝账号public static String APP_ID="2018121562XXXXX";//商户私钥,您的PKCS8格式RSA2私钥public static String MERCHANT_PRIVATE_KEY="MIIEvQIBADANxxxxxxxxxxxxx";//⽀付宝公钥,查看地址:https:///platform/keyManage.htm 对应APPID下的⽀付宝公钥。
Java应用中的在线支付与电子钱包随着电子商务的快速发展和在线交易的普及,越来越多的应用程序开始集成在线支付和电子钱包功能。
Java作为一种广泛使用的编程语言,为开发人员提供了丰富的工具和库来实现这些功能。
本文将探讨Java应用中的在线支付和电子钱包的一些常见实现方式和最佳实践。
一、支付网关集成在Java应用中实现在线支付的关键是集成支付网关。
支付网关是一个允许应用程序与银行的支付系统进行通信的中间平台。
Java提供了多种方式来与支付网关进行集成,其中一种常用的方式是使用第三方支付软件开发工具包(SDK)。
这些SDK可以使开发人员轻松地在应用程序中添加在线支付功能,比如支付宝SDK、微信支付SDK等。
在集成支付网关时,开发人员应该注意以下几点:1. 确保与支付网关的通信是安全的,使用SSL(Secure Sockets Layer)协议来加密数据传输,避免敏感信息泄露的风险;2. 对支付交易进行适当的验证和授权,包括验签、防止重复支付等;3. 处理支付结果通知,及时更新订单状态和库存信息;4. 提供良好的用户体验,例如显示加载中的提示,实现支付失败时的友好提示等。
二、电子钱包的实现电子钱包是在Java应用中常见的功能之一,它允许用户存储一定金额的虚拟货币,并用于在线支付和消费。
以下是一些实现电子钱包的建议:1. 数据库存储:使用数据库存储用户的账户余额和交易记录。
Java应用可以使用一种数据库连接工具,如JDBC(Java Database Connectivity),通过执行SQL查询和更新语句来实现与数据库的交互。
2. 安全性措施:通过使用哈希算法对用户密码进行加密存储,并在用户登录时进行密码验证,确保账户的安全性。
此外,添加交易密码和双因素认证等安全措施,可以提高用户的资金安全性。
3. 交易记录:记录每笔交易的详细信息,包括交易金额、时间、支付对象等。
这些信息对于用户来说是有用的,同时也可以用于后期的数据分析和统计。
java支付路由规则代码实现在Java中实现支付路由规则,通常涉及到解析支付请求,根据特定的规则(例如最低费率、服务可用性等)选择一个支付网关或服务。
下面是一个简单的例子,演示了如何实现这个过程。
假设我们有一个`PaymentGateway`接口,表示支付网关:```javapublic interface PaymentGateway {String NAME = "Payment Gateway";boolean isAvailable();double getFeeRate();void processPayment(PaymentRequest request);}```然后,我们创建几个实现这个接口的类,表示不同的支付网关:```javapublic class PaymentGatewayA implements PaymentGateway { Overridepublic boolean isAvailable() {return true;}Overridepublic double getFeeRate() {return ; // 2% fee rate}Overridepublic void processPayment(PaymentRequest request) {// Implement payment processing logic here}}public class PaymentGatewayB implements PaymentGateway {Overridepublic boolean isAvailable() {return true;}Overridepublic double getFeeRate() {return ; // % fee rate}Overridepublic void processPayment(PaymentRequest request) {// Implement payment processing logic here}}```接下来,我们可以创建一个`PaymentRouter`类,实现支付路由规则:```javaimport ;import ;import ;import ;import ;import ;import ;import ;import ;import ;import ;import ;import ;import ;import ;import ;import ;import ;import ; // uncomment for Java 8 and above (or use your favorite library) for Stream API support in this code snippet only! Java 8 has no support for Stream API in this code snippet! If you use Java 8, remove the comments from the import statements for Stream APIsupport! Java 8 has no support for Stream API in this code snippet! If you use Java 8, remove the comments from the import statements for Stream API support! Java 8 has no support for Stream API in this code snippet! If you use Java 8, remove the comments from the import statements for Stream API support! Java 8 has no support for Stream API in this code snippet! If you use Java 8, remove the comments from the import statements for Stream API support! Java 8 has no support for Stream API in this code snippet! If you use Java 8, remove the comments from the import statements for Stream API support! Java 8 has no support for Stream API in this code snippet! If you use Java 8, remove the comments from the import statements for Stream API support! Java 8 has no support for Stream API in this code snippet! If you use Java 8, remove the comments from the import statements for Stream API support! Java 8 has no support for Stream API in this code snippet! If you use Java 8, remove the comments from the import statements for Stream API support! Java 8 has no support for Stream API in this code snippet! If you use Java 8, remove the comments from the import statements for Stream API support! Java 8 has no support for Stream API in this code snippet! If you use Java 8, remove the comments from the import statements for Stream API support! Java 8 has no support for Stream API in thiscode snippet! If you use Java 8, remove the comments from the import statements for Stream API support! Java 8 has no support for Stream API in this code snippet! If you use Java 8, remove the comments from the import statements for Stream API support! Java 8 has no support for Stream API in this code snippet! If you use Java 8, remove the comments from the import statements for Stream API support! Java 8 has no support for Stream API in this code snippet! If you use Java 8, remove the comments from the import statements for Stream API support! Java 8 has no support for Stream API in this code。
利用Java实现跨平台移动支付系统设计与开发移动支付系统已经成为现代社会中不可或缺的一部分,随着智能手机的普及和移动互联网的发展,人们越来越习惯使用手机进行支付。
为了满足用户的需求,开发一个跨平台的移动支付系统变得至关重要。
本文将介绍如何利用Java语言设计和开发一个跨平台移动支付系统。
1. 背景介绍移动支付系统是指用户通过移动设备(如智能手机、平板电脑等)进行支付的一种支付方式。
随着移动互联网的快速发展,移动支付系统已经成为人们生活中不可或缺的一部分。
为了提高用户体验和方便用户进行支付,开发一个跨平台的移动支付系统显得尤为重要。
2. 技术选型在设计和开发跨平台移动支付系统时,我们选择使用Java语言作为开发语言。
Java是一种跨平台的编程语言,具有良好的跨平台性能,可以在不同操作系统上运行。
此外,Java拥有丰富的开发工具和框架,能够帮助我们快速高效地开发出功能完善的移动支付系统。
3. 系统架构设计3.1 前端设计在前端设计上,我们可以采用HTML5、CSS3和JavaScript等前端技术来实现跨平台的界面展示。
通过响应式设计和适配不同屏幕尺寸的布局,确保用户在不同设备上都能够流畅使用移动支付系统。
3.2 后端设计在后端设计上,我们可以采用Spring框架来实现业务逻辑处理和数据交互。
通过Spring Boot简化项目搭建和配置,结合Spring Security保障系统安全性,同时使用Spring Data JPA进行数据库操作,提高数据处理效率。
3.3 数据库设计在数据库设计上,我们可以选择使用MySQL或者Oracle等关系型数据库来存储用户信息、交易记录等数据。
通过合理设计数据库表结构和建立索引,提高数据查询和存储效率。
4. 功能模块设计4.1 用户管理模块用户管理模块包括用户注册、登录、个人信息管理等功能。
用户可以通过手机号码或邮箱注册账号,并且可以使用账号密码或者指纹、人脸识别等方式登录系统。
Java应用开发中的支付系统集成支付系统在Java应用开发中扮演着至关重要的角色。
随着电子商务的兴起和移动支付的普及,支付系统集成无疑成为了每个Java开发人员需要了解和掌握的技术。
本文将介绍Java应用开发中支付系统集成的相关知识和最佳实践。
一、概述支付系统集成是指将第三方支付接口或支付网关与Java应用程序进行连接和交互的过程。
通过支付系统集成,Java应用可以实现在线支付、订单支付、退款等功能,从而提供便捷的支付服务。
二、支付系统集成的必要性支付系统集成在Java应用开发中具有以下几个重要的必要性:1. 提供多样化的支付方式:支付系统集成可以支持多种支付方式,包括银行卡支付、支付宝、微信支付、Apple Pay等,满足用户多样化的支付需求。
2. 提升用户体验:支付系统集成可以提供更加便捷、安全的支付体验,简化用户支付流程,提高用户的满意度和粘性。
3. 降低开发难度和风险:通过集成已经成熟的支付系统,可以避免从零开始开发支付功能,减少开发难度和风险,加快项目的开发进度。
三、支付系统集成的关键技术和步骤支付系统集成涉及到以下关键技术和步骤:1. 商户注册和对接:首先需要在支付系统注册商户账号并获得相关的商户密钥和证书。
然后,根据支付系统提供的开发文档,对接支付接口,实现与支付系统的数据交互。
2. 支付接口调用:通过调用支付接口,向支付系统发送支付请求,并接收支付系统返回的支付结果。
支付接口通常使用HTTP/HTTPS协议进行数据传输,可以使用Java的网络编程技术实现。
3. 支付结果处理:根据支付系统返回的支付结果,判断支付是否成功,并根据支付结果更新订单状态或向用户展示支付结果。
同时,应保证支付结果的安全性和可靠性。
4. 异常处理和退款:在支付过程中,可能会遇到各种异常情况,如网络中断、支付超时等。
需要在代码中添加相应的异常处理逻辑,并及时进行退款处理,以保证支付操作的可靠性。
四、支付系统集成的最佳实践为保证支付系统集成的稳定性和安全性,以下是一些最佳实践建议:1. 选择可靠的支付系统供应商:选择具备良好声誉和稳定性的支付系统供应商,确保支付系统能够稳定运行,并及时提供技术支持。
Java应用中的电子支付与金融安全随着互联网的快速发展,电子支付已经逐渐成为人们生活中不可或缺的一部分。
作为一种重要的付款方式,电子支付在Java应用中的应用也变得越来越广泛。
然而,随着电子支付的普及,金融安全问题也日益突出。
本文将探讨Java应用中的电子支付以及如何确保金融安全。
1. 电子支付的背景和优势电子支付是指通过计算机网络,利用电子设备进行支付的一种方式。
与传统的现金支付相比,电子支付具有以下优势:(1)便利性:电子支付无需携带现金,只需通过手机或电子设备完成支付即可。
(2)实时性:电子支付可以实现即时到账,方便快捷。
(3)安全性:电子支付通过加密技术和身份验证,增强了交易的安全性。
2. Java应用中的电子支付方式在Java应用中,有多种方式可以实现电子支付,以下是其中的几种常见方式:(1)第三方支付平台:通过使用第三方支付平台,用户可以将银行卡或其他支付账户与应用关联,实现在线支付。
(2)手机支付:通过在手机上安装支付应用,用户可以使用手机进行扫码支付或近场通信支付。
(3)电子钱包:用户可以将银行卡或其他支付账户信息存储在电子钱包中,通过Java应用调用电子钱包完成支付。
3. 保障金融安全的技术手段在使用Java应用进行电子支付时,保障金融安全至关重要。
以下是几种常见的技术手段:(1)身份认证:用户在进行电子支付前,需要进行身份验证。
这可以通过密码、指纹或其他生物特征进行验证。
(2)数据加密:在传输敏感信息时,应使用安全的加密算法对数据进行加密,以防止数据在传输过程中被窃取或篡改。
(3)安全协议:Java应用中可以使用安全协议,如SSL(Secure Sockets Layer),来确保通信的安全性。
(4)防止欺诈:Java应用应该实现欺诈检测和预防机制,通过分析用户行为和交易模式来及时识别可疑交易。
4. 持续改进与监测保障金融安全是一个持续不断的过程。
Java应用的开发者应该定期对系统进行检查和更新,确保安全补丁和更新的安装和使用。
Java项目经验范文项目背景本项目是一款基于Java语言开发的在线购物平台,旨在为用户提供便捷的购物体验。
该平台包含了商品展示、购物车、订单管理、支付等功能。
项目技术栈•后端:Java、Spring、Spring MVC、MyBatis、MySQL、Redis、Tomcat、Maven•前端:HTML、CSS、JavaScript、jQuery、Bootstrap项目架构本项目采用了MVC架构,将业务逻辑、数据访问和视图分离,使得代码结构清晰,易于维护。
具体架构如下:•Controller层:负责接收用户请求,调用Service层处理业务逻辑,并将结果返回给前端。
•Service层:负责处理业务逻辑,调用Dao层进行数据访问,并将结果返回给Controller层。
•Dao层:负责与数据库进行交互,进行数据的增删改查操作。
项目亮点1. Redis缓存为了提高系统的性能,本项目采用了Redis缓存技术。
在商品展示、购物车、订单管理等功能中,使用Redis缓存来存储数据,减少了对数据库的访问次数,提高了系统的响应速度。
2. 支付宝支付本项目采用了支付宝支付技术,为用户提供了便捷的支付方式。
用户可以通过支付宝扫码或者输入支付宝账号密码进行支付,支付成功后,系统会自动更新订单状态。
3. 安全性为了保障用户的信息安全,本项目采用了多种安全措施。
在用户注册、登录、支付等环节中,使用了加密算法,保障了用户的信息不被泄露。
同时,系统还对用户输入的数据进行了校验,防止了SQL注入等攻击。
项目总结本项目是一款基于Java语言开发的在线购物平台,采用了MVC架构,使用了Redis缓存技术和支付宝支付技术,保障了用户的信息安全。
在开发过程中,我们遇到了很多问题,但是通过不断的努力和学习,我们最终完成了这个项目。
通过这个项目,我们不仅学习了Java语言和相关技术,还锻炼了我们的团队协作能力和解决问题的能力。
主题:Java中的支付策略模式和模板方法随着互联网的快速发展,电子商务成为人们生活中不可或缺的一部分。
而支付功能是电子商务中至关重要的一环,其安全性和稳定性直接关系到用户的购物体验和信任度。
在Java开发中,为了提高支付功能的灵活性和可扩展性,支付策略模式和模板方法成为了常用的设计模式。
一、支付策略模式1.1 定义和特点支付策略模式是一种行为设计模式,它定义了一系列算法,将每个算法封装起来,并使它们可以相互替换。
这种模式使得算法可以独立于使用它的客户端而变化。
1.2 实现方式在Java中实现支付策略模式,首先需要定义一个支付策略接口,然后针对不同的支付方式(如支付宝、信信、银联等)分别实现具体的支付策略类。
客户端根据具体的支付方式选择相应的支付策略类进行支付操作。
1.3 优点和适用场景支付策略模式可以方便地扩展新的支付方式,而不影响原有的支付逻辑,使得支付功能更具灵活性和可维护性。
适用于需要支持多种支付方式的场景,如电子商务评台。
二、模板方法2.1 定义和特点模板方法是一种行为设计模式,它定义了一个算法的骨架,将算法中的某些步骤延迟到子类中实现。
模板方法使得子类可以在不改变算法结构的情况下重新定义算法中的某些步骤。
2.2 实现方式在Java中实现模板方法,首先需要定义一个抽象类,该抽象类包含模板方法和需要延迟到子类实现的抽象方法。
子类继承抽象类并实现抽象方法,从而完成算法中特定的步骤。
2.3 优点和适用场景模板方法将算法的骨架和具体的实现分离,使得算法结构更清晰,易于理解和维护。
适用于需要定义算法的框架和具体步骤的场景,如支付流程中的订单查询、支付结果通知等。
三、支付策略模式与模板方法的结合3.1 设计思路在实际的支付功能中,支付策略模式和模板方法可以结合使用。
通过支付策略模式实现不同支付方式的灵活切换,同时通过模板方法定义支付流程的骨架和具体步骤,使得支付功能更加稳定和可扩展。
3.2 实现方式在Java开发中,可以先定义支付策略接口和具体的支付策略类,针对每种支付方式实现不同的支付逻辑。
Java版支付宝支付功能整理文档 (2)一、引用文件 (2)1、基础配置类:AlipayConfig.java (2)2、支付宝MD5签名处理核心文件:MD5.java (4)3、支付宝接口公用函数类:AlipayCore.java (5)4、支付宝通知处理类:AlipayNotify.java (9)5、支付宝各接口请求提交类:AlipaySubmit.java (12)6.自定义订单类:UtilDate.java (16)7.HttpClient方式访问:HttpProtocolHandler.java (17)8、Http请求对象的封装:HttpRequest.java (23)9、Http返回对象的封装:HttpResponse.java (27)10、表示Http返回的结果字符方式:HttpResultType.java (29)二、Controller处理方法 (30)1、支付宝PC端支付(即时到账) (30)(1、)支付方法 (30)(2、)支付成功后的同步调用 (31)(4、)支付成功后的异步调用 (33)2、支付宝手机网页支付 (35)(1、)支付方法 (35)(2、)支付成功后的同步调用 (37)(4、) 支付成功后的异步调用 (37)三、页面代码 (37)1、跳转页面:alipay.jsp和alipaywap.jsp (37)2、同步调用页面:return_url.jsp (38)3、异步调用页面:notify_url.jsp (38)Java版支付宝支付功能整理文档作者:Lock-玄清时间:2017-03-15注:此文档只支持付款,没有退款的功能一、引用文件1、基础配置类:AlipayConfig.javapackage com.alipay.config;/* **类名:AlipayConfig*功能:基础配置类*详细:设置帐户有关信息及返回路径*版本:3.4*修改日期:2016-03-08*说明:*以下代码只是为了方便商户测试而提供的样例代码,商户可以根据自己网站的需要,按照技术文档编写,并非一定要使用该代码。
微信、⽀付宝⼆码合⼀扫码⽀付实现思路(java)⼀、⽀付⼆维码(预订单)根据需要购买的信息创建预订单,将订单信息保存到Redis中,并设置有效期,注意⽣产⼆维码的链接后的参数可以关联到Redis中的key;QRCode 为servlet扫码请求的URL;UUIDUtils.getUUID() 为预订单单号,在servlet请求中截取,然后在Redis中查找对应的Key的数据;⼆、创建⼆维码扫码请求地址servlet:QRCodeServlet;微信⽀付重定向请求servlet:WechatPayServlet;⽀付宝重定向请求servlet:AliPayServlet;QRCodeServlet ⽤于⽤户使⽤微信或者⽀付宝扫码⼆维码进⾏客户端识别及重定向到对应的业务处理;package com.platform.cloudlottery.servlet;import java.io.IOException;import javax.servlet.ServletConfig;import javax.servlet.ServletException;import javax.servlet.http.HttpServlet;import javax.servlet.http.HttpServletRequest;import javax.servlet.http.HttpServletResponse;import org.slf4j.Logger;import org.slf4j.LoggerFactory;import org.springframework.beans.factory.annotation.Autowired;import org.springframework.web.context.support.SpringBeanAutowiringSupport;import monConfig;import mon.alipay.config.MyAliPayConfig;import mon.wechat.config.WXPublicConfig;import mon.wechat.util.HttpUtil;import com.platform.cloudlottery.model.SysPayChannel;import com.platform.cloudlottery.service.Impl.SysPayChannelServiceImpl;import com.platform.cloudlottery.web.StatusContant.PayTypeConstant;/*** @ClassName: QRCodeServlet* @Description: TODO(根据请求的后缀获取该数据编码对应的数据,并重定向到页⾯)* @author chenkun* @date 2018年12⽉29⽇**/public class QRCodeServlet extends HttpServlet {private static final long serialVersionUID = -8457626626670970403L;protected Logger logger = LoggerFactory.getLogger(getClass());private static final String UrlStr = "QRCode/";private static final String wechatPay = "wechatPay/";private static final String aliPay = "aliPay/";@Autowiredprivate SysPayChannelServiceImpl payChannelService;public void init(ServletConfig servletConfig) throws ServletException {super.init(servletConfig);SpringBeanAutowiringSupport.processInjectionBasedOnServletContext(this, servletConfig.getServletContext());}public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {("####################请求开始####################");String userAgent = request.getHeader("user-agent");String RequestURL = request.getRequestURL().toString();("URL : " + RequestURL);String ReqInfo = RequestURL.substring(RequestURL.indexOf(UrlStr)+UrlStr.length());("URL : " + ReqInfo);CommonConfig commonConfig = new CommonConfig();if (userAgent != null && userAgent.contains("AlipayClient")) {("来⾃⽀付宝");String redirecturi = HttpUtil.urlEnCode(commonConfig.getDomain() + aliPay + ReqInfo);("REDIRECT_URI="+redirecturi);SysPayChannel channel = payChannelService.selectByChannelType(PayTypeConstant.Alipay);MyAliPayConfig aliPayConfig = new MyAliPayConfig();aliPayConfig.setAppId(channel.getAppid());// 授权页⾯地址String requestUrl = aliPayConfig.getAuthgateway();requestUrl = requestUrl.replace("APPID", aliPayConfig.getAppId()).replace("SCOPE", aliPayConfig.getScope()).replace("REDIRECT_URI", redirecturi);// 重定向到授权页⾯response.sendRedirect(requestUrl);} else if (userAgent != null && userAgent.contains("MicroMessenger")) {("来⾃微信");String redirecturi = HttpUtil.urlEnCode(commonConfig.getDomain() + wechatPay + ReqInfo);("REDIRECT_URI="+redirecturi);SysPayChannel channel = payChannelService.selectByChannelType(PayTypeConstant.Wechat);WXPublicConfig publicConfig = new WXPublicConfig();publicConfig.setAppId(channel.getAppid());publicConfig.setOriginId(channel.getOriginid());publicConfig.setAppSecret(channel.getAppsecret());publicConfig.setEncodingAESKey(channel.getEncodingaeskey());// 授权页⾯地址String requestUrl = publicConfig.getAuthorizeinterface();requestUrl = requestUrl.replace("APPID", publicConfig.getAppId()).replace("REDIRECT_URI", redirecturi).replace("SCOPE", publicConfig.getScope()).replace("STATE", publicConfig.getState()); // 重定向到授权页⾯response.sendRedirect(requestUrl);} else {("未知来源");}("####################请求结束####################");}public void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {doGet(request, response);}}WechatPayServlet 在获取到Redis中预订单数据后,创建真实订单并调⽤微信“统⼀下单接⼝”;package com.platform.cloudlottery.servlet;import com.alibaba.fastjson.JSONObject;import com.github.wxpay.sdk.WXPayUtil;import monConfig;import mon.jedis.JedisUtil;import ng.StringUtils;import mon.utils.BusinessCodeUtils;import mon.wechat.bean.WeiXinOAuth2Token;import mon.wechat.bean.WeiXinUserInfo;import mon.wechat.config.WXPayConfig;import mon.wechat.config.WXPublicConfig;import mon.wechat.util.WeiXinOAuth2Util;import mon.wechat.util.WeiXinPayUtils;import com.platform.cloudlottery.model.SysPayChannel;import com.platform.cloudlottery.service.Impl.LotteryOrderServiceImpl;import com.platform.cloudlottery.service.Impl.SysPayChannelServiceImpl;import erMemberServiceImpl;import com.platform.cloudlottery.service.OrderServcie;import erInfoService;import com.platform.cloudlottery.web.ResultContant;import com.platform.cloudlottery.web.StatusContant.PayTypeConstant;import com.platform.cloudlottery.web.SysKey;import org.slf4j.Logger;import org.slf4j.LoggerFactory;import org.springframework.beans.factory.annotation.Autowired;import org.springframework.beans.factory.annotation.Value;import org.springframework.web.context.support.SpringBeanAutowiringSupport;import redis.clients.jedis.Jedis;import javax.servlet.ServletConfig;import javax.servlet.ServletException;import javax.servlet.http.HttpServlet;import javax.servlet.http.HttpServletRequest;import javax.servlet.http.HttpServletResponse;import java.io.IOException;import java.math.BigDecimal;import java.util.Date;import java.util.LinkedHashMap;import java.util.Map;/*** @ClassName: WechatPayServlet* @Description: TODO(这⾥⽤⼀句话描述这个类的作⽤)* @author chenkun* @date 2019年1⽉5⽇**/public class WechatPayServlet extends HttpServlet {private static final long serialVersionUID = -8457626626670970403L;protected Logger logger = LoggerFactory.getLogger(getClass());private static Jedis redis = JedisUtil.getJedis();@Value("${config.domain}")private String domain;@Value("${config.isProduction}")private boolean isProduction;// 请求路径包含的字符串private static final String UrlStr = "wechatPay/";@Autowiredprivate SysPayChannelServiceImpl payChannelService;@Autowiredprivate UserMemberServiceImpl memberService;@Autowiredprivate LotteryOrderServiceImpl lotteryOrderService;public void init(ServletConfig servletConfig) throws ServletException {super.init(servletConfig);SpringBeanAutowiringSupport.processInjectionBasedOnServletContext(this, servletConfig.getServletContext());}public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {logger.debug("####################请求开始####################");request.setCharacterEncoding("utf-8");response.setCharacterEncoding("utf-8");try {// ⽤户同意授权后,能获取到codeString code = request.getParameter("code");// ⽤户同意授权if (!"authdeny".equals(code)) {CommonConfig commonConfig = new CommonConfig();String RequestURL = request.getRequestURL().toString();logger.debug("URL : " + RequestURL);String QRCodeUrl = RequestURL.substring(RequestURL.indexOf(UrlStr) + UrlStr.length());String QRCodeReqInfo = QRCodeUrl.split("&")[0];String operatorId = QRCodeUrl.split("&")[1];logger.debug("QRCodeReqInfo : " + QRCodeReqInfo +";operatorId : " + operatorId);String advancekey = commonConfig.getLotteryorder() + QRCodeReqInfo;SysPayChannel channel = payChannelService.selectByChannelType(PayTypeConstant.Wechat);WXPublicConfig publicConfig = new WXPublicConfig();publicConfig.setAppId(channel.getAppid());publicConfig.setOriginId(channel.getOriginid());publicConfig.setAppSecret(channel.getAppsecret());publicConfig.setEncodingAESKey(channel.getEncodingaeskey());WXPayConfig payConfig = new WXPayConfig();payConfig.setMchId(channel.getMchid());payConfig.setAppId(channel.getAppid());payConfig.setKey(channel.getWxkey());payConfig.setApicertPath(channel.getPayCertUrl());payConfig.setSpbillCreateIp(channel.getSpbillcreateip());// 获取⽹页授权access_tokenWeiXinOAuth2Token weixinOauth2Token = WeiXinOAuth2Util.getOAuth2AccessToken(publicConfig,code);// ⽹页授权接⼝访问凭证String accessToken = weixinOauth2Token.getAccessToken();logger.debug("accessToken=" + accessToken);// ⽤户标识String openId = weixinOauth2Token.getOpenId();logger.debug("openId="+openId);// 获取⽤户信息WeiXinUserInfo userInfo = WeiXinOAuth2Util.getOAuth2UserInfo(publicConfig, accessToken, openId);logger.debug(userInfo.getNickName()+"=====微信⽀付====="+userInfo.getOpenId());//添加或更新⽤户信息String userid = UserInfoService.CreateUserMember(userInfo,memberService);if (!redis.exists(advancekey)) {// 判断key是否存在logger.debug("⼆维码失效");request.setAttribute("code", ResultContant.notuserdqrcode);request.setAttribute("message", "⼆维码失效");request.getRequestDispatcher("../wechat/WechatPay.jsp").forward(request, response);logger.debug("####################请求结束####################");return;}if (StringUtils.trimToEmpty(redis.get(advancekey)).equals("")) {logger.debug("⼆维码失效");request.setAttribute("code", ResultContant.notuserdqrcode);request.setAttribute("message", "⼆维码失效");request.getRequestDispatcher("../wechat/WechatPay.jsp").forward(request, response);logger.debug("####################请求结束####################");return;}JSONObject jsonObject = JSONObject.parseObject(redis.get(advancekey));if (null == jsonObject) {logger.debug("⼆维码失效");request.setAttribute("code", ResultContant.notuserdqrcode);request.setAttribute("message", "⼆维码失效");request.getRequestDispatcher("../wechat/WechatPay.jsp").forward(request, response);logger.debug("####################请求结束####################");return;}if (redis.get(advancekey + "_lock") != null && !redis.get(advancekey + "_lock").equals("")){logger.debug("⼆维码失效");request.setAttribute("code", ResultContant.notuserdqrcode);request.setAttribute("message", "⼆维码失效");request.getRequestDispatcher("../wechat/WechatPay.jsp").forward(request, response);logger.debug("####################请求结束####################");return;}redis.setex(advancekey + "_lock", 1, "lock");String orderid = BusinessCodeUtils.getOrderNo(jsonObject.getString(SysKey.deviceSn));int money = jsonObject.getIntValue(SysKey.money);int lotterytype = jsonObject.getIntValue(SysKey.lotteryType);if (!orderid.equals("") && money!=0) {//创建订单boolean bool = OrderServcie.createorder(QRCodeReqInfo, PayTypeConstant.Wechat, payConfig.getAppID(), userid, openId, orderid, jsonObject, lotteryOrderService); if (bool) {//删除预订单信息redis.del(advancekey);//⼀个预订单只能创建⼀个订单String paymoney = String.valueOf(money);if (!isProduction) {//测试环境paymoney = BigDecimal.valueOf(Long.valueOf(paymoney)).divide(new BigDecimal(100)).toString();//真实⾦额除100}logger.debug("是否⽣产环境:"+isProduction+";订单⾦额为:"+String.valueOf(money)+";实际⽀付⾦额为:"+paymoney);//创建微信订单Map<String, String> map = WeiXinPayUtils.createOrderJsapi(domain, payConfig, orderid, paymoney, lotterytype==0?"即开票":"电脑票", openId);logger.debug("创建微信⽀付预订单返回数据:"+JSONObject.toJSONString(map));if (map != null) {if (map.get("return_code").equals("SUCCESS")) {if (map.get("result_code").equals("SUCCESS")) {logger.debug("创建微信⽀付预订单成功");Map<String, String> data = new LinkedHashMap<String, String>();data.put("appId", payConfig.getAppID());data.put("timeStamp", String.valueOf(new Date().getTime()/1000));data.put("nonceStr", WXPayUtil.generateNonceStr());data.put("package", "prepay_id="+map.get("prepay_id"));data.put("signType", "MD5");data.put("paySign", WXPayUtil.generateSignature(data, payConfig.getKey()));logger.debug("返回到客户端的数据:"+JSONObject.toJSONString(data));request.setAttribute("appId", data.get("appId"));request.setAttribute("timeStamp", data.get("timeStamp"));request.setAttribute("nonceStr", data.get("nonceStr"));request.setAttribute("package", data.get("package"));request.setAttribute("signType", data.get("signType"));request.setAttribute("paySign", data.get("paySign"));request.setAttribute("code", ResultContant.sucess);request.setAttribute("message", "成功");request.getRequestDispatcher("../wechat/WechatPay.jsp").forward(request, response);}else{logger.debug("创建订单失败:创建⽀付预订单失败");request.setAttribute("code", ResultContant.createordererror);request.setAttribute("message", "创建订单失败");request.getRequestDispatcher("../wechat/WechatPay.jsp").forward(request, response);}} else {logger.debug("创建订单失败:创建⽀付预订单失败");request.setAttribute("code", ResultContant.createordererror);request.setAttribute("message", "创建订单失败");request.getRequestDispatcher("../wechat/WechatPay.jsp").forward(request, response);}} else {logger.debug("创建订单失败:创建⽀付预订单失败");request.setAttribute("code", ResultContant.createordererror);request.setAttribute("message", "创建订单失败");request.getRequestDispatcher("../wechat/WechatPay.jsp").forward(request, response);}} else {logger.debug("创建订单失败:创建⽀付预订单失败");request.setAttribute("code", ResultContant.createordererror);request.setAttribute("message", "创建订单失败");request.getRequestDispatcher("../wechat/WechatPay.jsp").forward(request, response);}} else {logger.debug("创建订单失败;订单⾦额或者订单号数据有误");request.setAttribute("code", ResultContant.createordererror);request.setAttribute("message", "创建订单失败");request.getRequestDispatcher("../wechat/WechatPay.jsp").forward(request, response);}}} catch (Exception e) {e.printStackTrace();logger.debug("系统异常");request.setAttribute("code", ResultContant.notuserdqrcode);request.setAttribute("message", "⼆维码失效");request.getRequestDispatcher("../wechat/WechatPay.jsp").forward(request, response);}logger.debug("####################请求结束####################");}public void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { doGet(request, response);}}AliPayServlet 在获取到Redis中预订单数据后,创建真实订单并调⽤⽀付宝“⼿机⽹站⽀付接⼝”;package com.platform.cloudlottery.servlet;import com.alibaba.fastjson.JSONObject;import monConfig;import mon.alipay.bean.AliPayOAuth2Token;import mon.alipay.bean.AliPayUserInfo;import mon.alipay.config.MyAliPayConfig;import mon.alipay.uitl.AliPayOAuth2Util;import mon.alipay.uitl.AlipayPayUtils;import mon.jedis.JedisUtil;import ng.StringUtils;import mon.properties.PropertiesUtils;import mon.utils.BusinessCodeUtils;import com.platform.cloudlottery.model.SysPayChannel;import com.platform.cloudlottery.service.Impl.LotteryOrderServiceImpl;import com.platform.cloudlottery.service.Impl.SysPayChannelServiceImpl;import erMemberServiceImpl;import com.platform.cloudlottery.service.OrderServcie;import erInfoService;import com.platform.cloudlottery.web.ResultContant;import com.platform.cloudlottery.web.StatusContant.PayTypeConstant;import com.platform.cloudlottery.web.SysKey;import org.slf4j.Logger;import org.slf4j.LoggerFactory;import org.springframework.beans.factory.annotation.Autowired;import org.springframework.beans.factory.annotation.Value;import org.springframework.web.context.support.SpringBeanAutowiringSupport;import redis.clients.jedis.Jedis;import javax.servlet.ServletConfig;import javax.servlet.ServletException;import javax.servlet.http.HttpServlet;import javax.servlet.http.HttpServletRequest;import javax.servlet.http.HttpServletResponse;import java.io.IOException;import java.math.BigDecimal;import java.util.Properties;/*** @ClassName: AliPayServlet* @Description: TODO(这⾥⽤⼀句话描述这个类的作⽤)* @author chenkun* @date 2019年1⽉5⽇**/public class AliPayServlet extends HttpServlet {private static final long serialVersionUID = -8457626626670970403L;protected Logger logger = LoggerFactory.getLogger(getClass());private static Jedis redis = JedisUtil.getJedis();@Value("${config.domain}")private String domain;@Value("${config.isProduction}")private boolean isProduction;// 请求路径包含的字符串private static final String UrlStr = "aliPay/";@Autowiredprivate SysPayChannelServiceImpl payChannelService;@Autowiredprivate UserMemberServiceImpl memberService;@Autowiredprivate LotteryOrderServiceImpl lotteryOrderService;public void init(ServletConfig servletConfig) throws ServletException {super.init(servletConfig);SpringBeanAutowiringSupport.processInjectionBasedOnServletContext(this, servletConfig.getServletContext());}public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { logger.debug("####################请求开始####################");request.setCharacterEncoding("utf-8");response.setCharacterEncoding("utf-8");try {//⽤户同意授权后,能获取到codeString code = request.getParameter("auth_code");//⽤户同意授权if (!code.equals("")) {CommonConfig commonConfig = new CommonConfig();//具体业务String RequestURL = request.getRequestURL().toString();logger.debug("URL : " + RequestURL);String QRCodeUrl = RequestURL.substring(RequestURL.indexOf(UrlStr) + UrlStr.length());String QRCodeReqInfo = QRCodeUrl.split("&")[0];String operatorId = QRCodeUrl.split("&")[1];logger.debug("QRCodeReqInfo : " + QRCodeReqInfo +";operatorId : " + operatorId);String advancekey = commonConfig.getLotteryorder() + QRCodeReqInfo;SysPayChannel channel = payChannelService.selectByChannelType(PayTypeConstant.Alipay);MyAliPayConfig aliPayConfig = new MyAliPayConfig();aliPayConfig.setAppId(channel.getAppid());String certsrc = channel.getPayCertUrl();Properties propertiesFile = PropertiesUtils.getPropertiesFile(certsrc);if (propertiesFile != null) {aliPayConfig.setPayeeAccount(propertiesFile.getProperty("ALI_PAYEE_ACCOUNT"));aliPayConfig.setAppId(propertiesFile.getProperty("ALI_APP_ID"));aliPayConfig.setAliPayPublicKey(propertiesFile.getProperty("ALI_ALIPAY_PUBLIC_KEY"));aliPayConfig.setAppPayPublicKey(propertiesFile.getProperty("ALI_APP_PAY_PUBLIC_KEY"));aliPayConfig.setAppPrivateKey(propertiesFile.getProperty("ALI_APP_PRIVATE_KEY"));}//获取⽹页授权access_tokenAliPayOAuth2Token aliPayOAuth2Token = AliPayOAuth2Util.getOAuth2AccessToken(aliPayConfig,code);//⽹页授权接⼝访问凭证String accessToken = aliPayOAuth2Token.getAccessToken();logger.debug("accessToken=" + accessToken);//⽤户标识String aliuserid = aliPayOAuth2Token.getUserid();logger.debug("aliuserid="+aliuserid);//获取⽤户信息AliPayUserInfo userInfo = AliPayOAuth2Util.getOAuth2UserInfo(aliPayConfig,accessToken,aliuserid);logger.debug(userInfo.getNickName()+"=====⽀付宝⽀付====="+userInfo.getUserId());//添加或更新⽤户信息String userid = UserInfoService.CreateUserMember(userInfo,memberService);if (!redis.exists(advancekey)) {// 判断key是否存在logger.debug("⼆维码失效");request.setAttribute("code", ResultContant.notuserdqrcode);request.setAttribute("message", "⼆维码失效");request.getRequestDispatcher("../alipay/AliPay.jsp").forward(request, response);logger.debug("####################请求结束####################");return;}if (StringUtils.trimToEmpty(redis.get(advancekey)).equals("")) {logger.debug("⼆维码失效");request.setAttribute("code", ResultContant.notuserdqrcode);request.setAttribute("message", "⼆维码失效");request.getRequestDispatcher("../alipay/AliPay.jsp").forward(request, response);logger.debug("####################请求结束####################");return;}JSONObject jsonObject = JSONObject.parseObject(redis.get(advancekey));if (null == jsonObject) {logger.debug("⼆维码失效");request.setAttribute("code", ResultContant.notuserdqrcode);request.setAttribute("message", "⼆维码失效");request.getRequestDispatcher("../alipay/AliPay.jsp").forward(request, response);logger.debug("####################请求结束####################");return;}if (redis.get(advancekey + "_lock") != null && !redis.get(advancekey + "_lock").equals("")){logger.debug("⼆维码失效");request.setAttribute("code", ResultContant.notuserdqrcode);request.setAttribute("message", "⼆维码失效");request.getRequestDispatcher("../alipay/AliPay.jsp").forward(request, response);logger.debug("####################请求结束####################");return;}redis.setex(advancekey + "_lock", 1, "lock");String orderid = BusinessCodeUtils.getOrderNo(jsonObject.getString(SysKey.deviceSn));int money = jsonObject.getIntValue(SysKey.money);int lotterytype = jsonObject.getIntValue(SysKey.lotteryType);if (!orderid.equals("") && money != 0) {//创建订单boolean bool = OrderServcie.createorder(QRCodeReqInfo, PayTypeConstant.Alipay, aliPayConfig.getAppId(), userid, aliuserid, orderid, jsonObject, lotteryOrderService);if (bool) {//删除预订单信息redis.del(advancekey);//⼀个预订单只能创建⼀个订单String paymoney = BigDecimal.valueOf(Long.valueOf(money)).divide(new BigDecimal(100)).toString();if (!isProduction) {//测试环境paymoney = BigDecimal.valueOf(Long.valueOf(paymoney)).divide(new BigDecimal(100)).toString();//真实⾦额除100}logger.debug("是否⽣产环境:"+isProduction+";订单⾦额为:"+BigDecimal.valueOf(Long.valueOf(money)).divide(new BigDecimal(100)).toString()+";实际⽀付⾦额为:"+paymoney); //创建⽀付宝订单String responsestr = AlipayPayUtils.createOrderWapPay(domain, aliPayConfig, orderid, lotterytype==0?"即开票":"电脑票", paymoney, "");logger.debug("创建⽀付宝⽀付预订单返回数据:"+responsestr);if (!responsestr.equals("")) {response.setContentType("text/html;charset=UTF-8");response.getWriter().write(responsestr);//直接将完整的表单html输出到页⾯response.getWriter().flush();response.getWriter().close();response.getWriter().append("Served at: ").append(request.getContextPath());} else {logger.debug("创建订单失败:创建⽀付预订单失败");request.setAttribute("code", ResultContant.createordererror);request.setAttribute("message", "创建订单失败");request.getRequestDispatcher("../alipay/AliPay.jsp").forward(request, response);}} else {logger.debug("创建订单失败:创建⽀付预订单失败");request.setAttribute("code", ResultContant.createordererror);request.setAttribute("message", "创建订单失败");request.getRequestDispatcher("../alipay/AliPay.jsp").forward(request, response);}} else {logger.debug("创建订单失败;订单⾦额或者订单号数据有误");request.setAttribute("code", ResultContant.createordererror);request.setAttribute("message", "创建订单失败");request.getRequestDispatcher("../alipay/AliPay.jsp").forward(request, response);}}} catch (Exception e) {e.printStackTrace();logger.debug("系统异常");request.setAttribute("code", "⼆维码失效");request.setAttribute("message", "⼆维码失效");request.getRequestDispatcher("../alipay/AliPay.jsp").forward(request, response);}logger.debug("####################请求结束####################");}public void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {doGet(request, response);}}三、创建微信⽀付结果回调接⼝和⽀付宝⽀付接⼝回调接⼝,⽤于接收微信或者⽀付宝的⽀付结果通知;aliPayNotify ⽀付宝⽀付成功回调接⼝/*** @Title: aliPayNotify* @Description: TODO(⽀付宝⽀付成功过回调)* @author chenkun* @return 参数* @return String 返回类型* @throws*/@RequestMapping(value = "/aliPayNotify", method = RequestMethod.POST)public String aliPayNotify() {ServletRequestAttributes attributes = (ServletRequestAttributes) RequestContextHolder.getRequestAttributes();HttpServletRequest request = attributes.getRequest();Map<String, String> params = convertRequestParamsToMap(request); // 将异步通知中收到的待验证所有参数都存放到map中String paramsJson = JSON.toJSONString(params);("⽀付宝⽀付回调,{" + paramsJson + "}");try {SysPayChannel channel = payChannelService.selectByChannelType(PayTypeConstant.Alipay);MyAliPayConfig aliPayConfig = new MyAliPayConfig();aliPayConfig.setAppId(channel.getAppid());String certsrc = channel.getPayCertUrl();Properties propertiesFile = PropertiesUtils.getPropertiesFile(certsrc);if (propertiesFile != null) {aliPayConfig.setPayeeAccount(propertiesFile.getProperty("ALI_PAYEE_ACCOUNT"));aliPayConfig.setAppId(propertiesFile.getProperty("ALI_APP_ID"));aliPayConfig.setAliPayPublicKey(propertiesFile.getProperty("ALI_ALIPAY_PUBLIC_KEY"));aliPayConfig.setAppPayPublicKey(propertiesFile.getProperty("ALI_APP_PAY_PUBLIC_KEY"));aliPayConfig.setAppPrivateKey(propertiesFile.getProperty("ALI_APP_PRIVATE_KEY"));}// 调⽤SDK验证签名boolean signVerified = AlipaySignature.rsaCheckV1(params, aliPayConfig.getAliPayPublicKey(),aliPayConfig.getCharset(), aliPayConfig.getSigntype());if (signVerified) {("⽀付宝回调签名认证成功");// 按照⽀付结果异步通知中的描述,对⽀付结果中的业务内容进⾏1\2\3\4⼆次校验,校验成功后在response中返回success,校验失败返回failure this.check(params);// 另起线程处理业务executorService.execute(new AliPayNotifyTask(params,payCallBackService));// 如果签名验证正确,⽴即返回success,后续业务另起线程单独处理// 业务处理失败,可查看⽇志进⾏补偿,跟⽀付宝已经没多⼤关系。
Java后端微信⼩程序⽀付demo(⽹上说的坑⾥⾯基本上都有)Java 后端微信⼩程序⽀付⼀、遇到的问题1. 商户号该产品权限未开通,请前往商户平台>产品中⼼检查后重试2.签名错误3.已经调起微信统⼀下单接⼝,可以拿到预⽀付ID,但是前端⽀付的时候出现⽀付验证签名失败⽹上的问题基本上就是这三类下⾯说解决⽅案。
第⼀个问题:商户号的问题,微信app⽀付与微信⼩程序⽀付的商户号不同,微信app内⽀付与微信开放平台内的商户号绑定,微信⼩程序⽀付是与微信公众平台内的商户号绑定。
第⼆个问题:签名错误,第⼀次签名需要的appid mchid key 分别对应的是⼩程序的appid、微信公众平台绑定的商户号、以及商户平台的密钥(重要的事情说三遍:商户平台的!商户平台的!商户平台的!)。
这⾥重点说下商户平台的密钥(当时就是因为密钥的问题耽误了不少时间):具体请看图(商户平台--->账户中⼼--->API安全---->设置密钥)第三个问题:⽀付验证签名失败这个就得需要严格执⾏⼩程序⽀付⽂档中的⽣成签名的规则。
参数字段⼤⼩写、顺序⼀定要对(切记,切记,切记)如果能把以上都注意到了,那基本上没什么问题了。
下⾯是我⾃⼰写的demo供⼤家参考,有什么问题可以留⾔。
⼆、demo 事例1.下载商户的证书(在问题2的截图中已经展⽰下载的位置)放在resources下的cert⽬录下(cert⽬录需要⾃⼰⼿动建)2.实现微信的 WXPayConfig接⼝1package mon;23import com.github.wxpay.sdk.WXPayConfig;4import mons.io.IOUtils;56import java.io.ByteArrayInputStream;7import java.io.InputStream;89public class MiniprogramConfig implements WXPayConfig{1011private byte[] certData;1213public MiniprogramConfig() throws Exception {14 InputStream certStream = Thread.currentThread().getContextClassLoader().getResourceAsStream("cert/miniProgram/apiclient_cert.p12"); 15this.certData = IOUtils.toByteArray(certStream);16 certStream.close();17 }1819 @Override20public String getAppID() {21return "wx6db448a73f8a6666";22 } //⼩程序appid2324 @Override25public String getMchID() {26return "1500669999";27 } //商户号2829/** 商户平台-账户中⼼-API安全中的密钥 */30 @Override31public String getKey() {32return "1add1a30ac87aa77yyy2db72f57a237577777";33 }3435 @Override36public InputStream getCertStream() {37return new ByteArrayInputStream(this.certData);38 }3940 @Override41public int getHttpConnectTimeoutMs() {42return 0;43 }4445 @Override46public int getHttpReadTimeoutMs() {47return 0;48 }49 }3.调⽤微信统⼀下单接⼝并且实现签名1private Map<String, String> createMiniProgramTradePay(WxpayTradeAppPayModel model,String notifyUrl) throws Exception {2 MiniprogramConfig config = new MiniprogramConfig();34 WXPay wxpay = new WXPay(config);56 Map<String, String> data = new HashMap<>();7 data.put("appid",config.getAppID());8 data.put("mch_id",config.getMchID());9 data.put("body",model.getBody());10 data.put("out_trade_no", model.getOutTradeNo());11 data.put("device_info", "");12 data.put("fee_type", "CNY");13 data.put("total_fee", model.getTotalFee());14 data.put("spbill_create_ip", "127.0.0.1");15 data.put("notify_url", notifyUrl);16 data.put("trade_type", "JSAPI");17 data.put("openid",model.getOpenId());18// data.put("nonce_str","1add1a30ac87aa2db72f57a2375d8fec");19 String sign = WXPayUtil.generateSignature(data, config.getKey());20 data.put("sign",sign);2122 Map<String, String> resp = wxpay.unifiedOrder(data);23if ("SUCCESS".equals(resp.get("return_code"))) {24//再次签名25/** 重要的事情说三遍⼩程序⽀付所有的字段必须⼤写驼峰模式严格按照⼩程序⽀付⽂档26 *https:///wiki/doc/api/wxa/wxa_api.php?chapter=7_7&index=3#27 * ******* 我当初就因为timeStamp中S没⼤写弄了3个⼩时 **********28 * */29 Map<String, String> reData = new HashMap<>();30 reData.put("appId", config.getAppID());31 reData.put("nonceStr", resp.get("nonce_str"));32 String newPackage = "prepay_id=" + resp.get("prepay_id");33 reData.put("package", newPackage);34 reData.put("signType","MD5");35 reData.put("timeStamp", String.valueOf(System.currentTimeMillis() / 1000));3637 String newSign = WXPayUtil.generateSignature(reData, config.getKey());38 resp.put("paySign",newSign);39 resp.put("timeStamp", reData.get("timeStamp"));40return resp;41 } else {42throw new FrankyErrorException(resp.get("return_msg"));43 }4445 }说明:这⾥只是说明⼩程序⽀付与微信app内⽀付的不同和遇到的问题,有关⾥⾯⽤到微信的SDK,请看上⼀篇⽂章。
java实现在线支付国内电子商务系统实现的基本流程如下:客户在系统内下订单-> 系统根据订单生成支付宝接口url -> 客户通过url使用支付宝(网上银行)付款-> 支付宝将客户的付款完成信息发送给电子商务系统-> 系统收到支付宝信息后确定客户订单已经付款-> 进行发货等后续流程。
在开始下面的内容之前,你要先有一个支付宝账户,如果要集成支付宝接口,你还必须申请开通服务(关于如何开通,可以直接到支付宝网站上申请).在服务开通后,支付宝会给你2个字符串编号:1个partnerId(合作伙伴ID),还有1个securityCode(安全码).当你拿到这2个码的时候就可以开始下面的内容了.(1)如何调用支付宝接口?(将客户的订单信息按照既定的规则生成一个url跳转到支付宝网站)通过下面方法[makeOrderAlipayUrl(HttpServletRequest httpRequest,Order order)]的调用得到支付宝的url,然后进行跳转(response.sendRedirect(url);).[html]view plaincopy1./**2. * 根据订单生成支付宝接口URL.3. * @param httpRequest4. * @param order 订单实例5. * @return6. * @throws Exception7. */8. public static String makeOrderAlipayUrl(HttpServletRequest httpRequest,Order order) throws Exception {9. HashMap hm = new HashMap();10. hm.put("_input_charset",httpRequest.getCharacterEncoding());//采用相同的编码方式11. hm.put("body","您在上的订单");//填写在跳到支付宝页面上显示的付款内容信息12. hm.put("discount","-5");//填写折扣信息 -5表示抵扣5元13. hm.put("logistics_fee","10");//物流费用14. hm.put("logistics_payment","BUYER_PAY");//物流费用支付人BUYER_PAY=买家支付物流费用15. hm.put("logistics_type","EXPRESS");//物流方式16. hm.put("notify_url","/notifyurl.jsp");//客户付款后,支付宝调用的页面17. hm.put("out_trade_no",order.getId());//外部交易号,最好具有唯一性,在获取支付宝发来的付款信息时使用.18. hm.put("partner",partnerId);//partnerId(合作伙伴ID)19. hm.put("agent",partnerId);//partnerId(合作伙伴ID)20. hm.put("payment_type","1");//支付类型1=商品购买,2=服务购买,...21. hm.put("price","105.30");//订单金额信息22. hm.put("quantity","1");//订单商品数量,一般都是写1,它是按照整个订单包来计算23. hm.put("return_url","/ReturnUrl.jsp");//客户付款成功后,显示给客户的页面24. hm.put("seller_email","alipay@");//你的支付宝账户email25. hm.put("service","create_direct_pay_by_user");//create_direct_pay_by_user=直接付款,trade_create_by_buyer 担保付款26. hm.put("subject","的订单");//填写在跳到支付宝页面上显示的付款标题信息27. String payGateway = "https:///cooperate/gateway.do?";//跳转到支付宝的url头28. return makeUrl(hm,securityCode,httpRequest.getCharacterEncoding(),payGateway);//securityCode(安全码)29. }30. /**31. * 根据传入的参数生成alipay的支付URL32. * @param hm 参数值33. * @param securityCode 安全码34. * @param charset 编码35. * @param payGateway 支付宝gateway36. * @return37. */38. public static String makeUrl(HashMap hm,String securityCode,String charset,String payGateway) throws Exception{39. List keys = new ArrayList(hm.keySet());40. Collections.sort(keys);//支付宝要求参数必须按字母排序41. StringBuffer content = new StringBuffer();42. for (int i = 0; i <keys.size(); i++) {43. content.append((String) keys.get(i));44. content.append("=");45. content.append((String) hm.get((String) keys.get(i)));46. if (i != keys.size() - 1) {47. content.append("&");48. }49. }50. content.append(securityCode);51. String sign = md5(content.toString(),charset);52. content.delete(0,content.length());53. content.append(payGateway);54. for (int i = 0; i <keys.size(); i++) {55. content.append(keys.get(i));56. content.append("=");57. content.append(URLEncoder.encode((String) hm.get(keys.get(i)), charset));58. content.append("&");59. }60. content.append("&sign_type=MD5");61. keys.clear();62.keys = null;63. return content.toString();64. }65. /**66. * 生成md5编码字符串.67. * @param str 源字符串68. * @param charset 编码方式69. * @return70. *71. */72. public static String md5(String str,String charset) {73. if (str == null)74. return null;75. char hexDigits[] = { '0', '1', '2', '3', '4', '5', '6', '7', '8', '9',76. 'a', 'b', 'c', 'd', 'e', 'f' };77. MessageDigest md5MessageDigest = null;78. byte[] md5Bytes = null;79. char md5Chars[] = null;80. byte[] strBytes = null;81. try {82.strBytes = str.getBytes(charset);83.md5MessageDigest = MessageDigest.getInstance("MD5");84. md5MessageDigest.update(strBytes);85.md5Bytes = md5MessageDigest.digest();86. int j = md5Bytes.length;87.md5Chars = new char[j * 2];88. int k = 0;89. for (int i = 0; i <j; i++) {90. byte md5Byte = md5Bytes;91. md5Chars[k++] = hexDigits[md5Byte >>> 4 & 0xf];92. md5Chars[k++] = hexDigits[md5Byte & 0xf];93. }94. return new String(md5Chars);95. } catch (NoSuchAlgorithmException e) {96. //Log.output(e.toString(), Log.STD_ERR);97. return null;98. } catch (UnsupportedEncodingException e) {99. //Log.output(e.toString(), Log.STD_ERR);100. return null;101. } finally {102.md5MessageDigest = null;103.strBytes = null;104.md5Bytes = null;105. }106. }当客户通过接口url付款后,支付宝会自动的去调用前面提供的[notify_url]参数中的url.(2)支付宝将付款信息返回给系统当客户付款后,支付宝就会自动调用上面表单提供的[notify_url],下面是一个[notifyurl.jsp]的一个例子:[html]view plaincopy1.<%@ page contentType="text/html;charset=UTF-8"%><%@ page import="com.soft4j.AlipayMgr"%><%2. String ret = AlipayMgr.insert(request);3. if(ret==null){4. out.print("success");//成功接收支付宝发来的付款信息5. }else{6. out.print("fail");//出错7. }8.%>如果确认收到支付宝发来的客户付款信息,则返回"success",这样子支付宝就知道系统已经收到信息了;否则返回"fail",这样支付宝会过一段时间后再次发来。