1200字范文,内容丰富有趣,写作的好帮手!
1200字范文 > 25 【支付模块开发】——将配置好的支付宝沙箱环境集成到我们的项目中以及支付接口的

25 【支付模块开发】——将配置好的支付宝沙箱环境集成到我们的项目中以及支付接口的

时间:2022-05-02 01:55:31

相关推荐

25 【支付模块开发】——将配置好的支付宝沙箱环境集成到我们的项目中以及支付接口的

1、将支付宝Demo中的相关文件复制到我们的项目中:

首先,我们将Demo中src中的包及里面的文件复制到我们项目中

image.png

同样,我们也要讲zhifubao.properties这个配置文件方法我们项目中的resources目录下: image.png

加下来就是我们的jar包了~

首先我们先在webapp目录下面新建lib文件夹:然后将Demo中如图所示的四个jar包复制到lib目录下。

image.png

至于剩下的jar我们只用Maven配置即可

<!-- alipay --><dependencies><dependency><groupId>commons-codec</groupId><artifactId>commons-codec</artifactId><version>1.10</version></dependency><dependency><groupId>commons-configuration</groupId><artifactId>commons-configuration</artifactId><version>1.10</version></dependency><dependency><groupId>commons-lang</groupId><artifactId>commons-lang</artifactId><version>2.6</version></dependency><dependency><groupId>commons-logging</groupId><artifactId>commons-logging</artifactId><version>1.1.1</version></dependency><dependency><groupId>com.google.zxing</groupId><artifactId>core</artifactId><version>2.1</version></dependency><dependency><groupId>com.google.code.gson</groupId><artifactId>gson</artifactId><version>2.3.1</version></dependency><dependency><groupId>org.hamcrest</groupId><artifactId>hamcrest-core</artifactId><version>1.3</version></dependency></dependencies>

上面是jar包的配置,接下来我们在pom.xml里面配置一个插件,使项目编译需要的jar在项目部署的时候自动配置到上面的lib文件夹下:

<build><!-- geelynote maven的核心插件之-complier插件默认只支持编译Java 1.4,因此需要加上支持高版本jre的配置,在pom.xml里面加上 增加编译插件 --><plugin><groupId>org.apache.maven.plugins</groupId><artifactId>maven-compiler-plugin</artifactId><configuration><source>1.8</source><target>1.8</target><encoding>UTF-8</encoding><compilerArguments><extdirs>${project.basedir}/src/main/webapp/WEB-INF/lib</extdirs></compilerArguments></configuration></plugin></plugins></build>

继而我们运行一下复制过来的Main.class,发现Demo是可以跑起来的~

image.png

2、编写我们的支付接口
1、在portal下新建OrderController类:
image.png

OrderController类上添加这两行注解:并且添加后面要用到的日志配置。

@Controller@RequestMapping("/order/")public class OrderController {private static final Logger logger = LoggerFactory.getLogger(OrderController.class);}

*Controller:

//支付宝接口@RequestMapping("pay.do")@ResponseBodypublic ServerResponse pay(HttpSession session, Long orderNo, HttpServletRequest request) {User user = (User) session.getAttribute(Const.CURRENT_USER);if (user == null) {return ServerResponse.createByErrorCodeMessage(ResponseCode.NEED_LOGIN.getCode(), ResponseCode.NEED_LOGIN.getDesc());}//这是一个文件目录,用户存放支付宝中生成的二维码存放目录,对应的目录路径是tomcat 服务器目录String path = request.getSession().getServletContext().getRealPath("upload");return iOrderService.pay(orderNo, user.getId(), path);}

service包下新建IOrderService接口类

*Service:

public interface IOrderService {//支付接口的实现ServerResponse pay(Long orderNo, Integer userId, String path);}

同理在Impl包下新建对应的实现类:

*ServiceImpl:

//支付接口的实现public ServerResponse pay(Long orderNo,Integer userId,String path){Map<String, String> resultMap= Maps.newHashMap();Order order = orderMapper.selectByUserIdAndOrderNo(userId,orderNo);if(order == null){return ServerResponse.createByErrorMessage("用户没有该订单");}resultMap.put("orderNo",String.valueOf(order.getOrderNo()));// (必填) 商户网站订单系统中唯一订单号,64个字符以内,只能包含字母、数字、下划线,// 需保证商户系统端不能重复,建议通过数据库sequence生成,String outTradeNo = order.getOrderNo().toString();// (必填) 订单标题,粗略描述用户的支付目的。如“xxx品牌xxx门店当面付扫码消费”String subject = new StringBuilder().append("happymmall扫码支付").append(outTradeNo).toString();// (必填) 订单总金额,单位为元,不能超过1亿元// 如果同时传入了【打折金额】,【不可打折金额】,【订单总金额】三者,则必须满足如下条件:【订单总金额】=【打折金额】+【不可打折金额】String totalAmount = order.getPayment().toString();// (可选) 订单不可打折金额,可以配合商家平台配置折扣活动,如果酒水不参与打折,则将对应金额填写至此字段// 如果该值未传入,但传入了【订单总金额】,【打折金额】,则该值默认为【订单总金额】-【打折金额】String undiscountableAmount = "0";// 卖家支付宝账号ID,用于支持一个签约账号下支持打款到不同的收款账号,(打款到sellerId对应的支付宝账号)// 如果该字段为空,则默认为与支付宝签约的商户的PID,也就是appid对应的PIDString sellerId = "";// 订单描述,可以对交易或商品进行一个详细地描述,比如填写"购买商品2件共15.00元"String body = new StringBuilder().append("订单").append(outTradeNo).append("购买商品共").append(totalAmount).append("元").toString();// 商户操作员编号,添加此参数可以为商户操作员做销售统计String operatorId = "test_operator_id";// (必填) 商户门店编号,通过门店号和商家后台可以配置精准到门店的折扣信息,详询支付宝技术支持String storeId = "test_store_id";// 业务扩展参数,目前可添加由支付宝分配的系统商编号(通过setSysServiceProviderId方法),详情请咨询支付宝技术支持ExtendParams extendParams = new ExtendParams();extendParams.setSysServiceProviderId("208810000400500");// 支付超时,定义为120分钟String timeoutExpress = "120m";// 商品明细列表,需填写购买商品详细信息,List<GoodsDetail> goodsDetailList = new ArrayList<GoodsDetail>();List<OrderItem> orderItemList= orderItemMapper.getByOrderNoUserId(orderNo,userId);for (OrderItem orderItem : orderItemList){// 创建一个商品信息,参数含义分别为商品id(使用国标)、名称、单价(单位为分)、数量,如果需要添加商品类别,详见GoodsDetailGoodsDetail goods = GoodsDetail.newInstance(orderItem.getProductId().toString(), orderItem.getProductName(),BigDecimalUtil.mul(orderItem.getCurrentUnitPrice().doubleValue(),new Double(100).doubleValue()).longValue(), orderItem.getQuantity());// 创建好一个商品后添加至商品明细列表goodsDetailList.add(goods);}// // 创建一个商品信息,参数含义分别为商品id(使用国标)、名称、单价(单位为分)、数量,如果需要添加商品类别,详见GoodsDetail// GoodsDetail goods1 = GoodsDetail.newInstance("goods_id001", "xxx小面包", 1000, 1);// // 创建好一个商品后添加至商品明细列表// goodsDetailList.add(goods1);// 继续创建并添加第一条商品信息,用户购买的产品为“黑人牙刷”,单价为5.00元,购买了两件// GoodsDetail goods2 = GoodsDetail.newInstance("goods_id002", "xxx牙刷", 500, 2);// goodsDetailList.add(goods2);// 创建扫码支付请求builder,设置请求参数AlipayTradePrecreateRequestBuilder builder = new AlipayTradePrecreateRequestBuilder().setSubject(subject).setTotalAmount(totalAmount).setOutTradeNo(outTradeNo).setUndiscountableAmount(undiscountableAmount).setSellerId(sellerId).setBody(body).setOperatorId(operatorId).setStoreId(storeId).setExtendParams(extendParams).setTimeoutExpress(timeoutExpress).setNotifyUrl(PropertiesUtil.getProperty("alipay.callback.url"))//支付宝服务器主动通知商户服务器里指定的页面http路径,根据需要设置//.setNotifyUrl("/order/alipay_callback.do").setGoodsDetailList(goodsDetailList);/** 一定要在创建AlipayTradeService之前调用Configs.init()设置默认参数* Configs会读取classpath下的zfbinfo.properties文件配置信息,如果找不到该文件则确认该文件是否在classpath目录*/Configs.init("zfbinfo.properties");/** 使用Configs提供的默认参数* AlipayTradeService可以使用单例或者为静态成员对象,不需要反复new*/AlipayTradeService tradeService = new AlipayTradeServiceImpl.ClientBuilder().build();AlipayF2FPrecreateResult result = tradeService.tradePrecreate(builder);switch (result.getTradeStatus()) {case SUCCESS:logger.info("支付宝预下单成功: )");AlipayTradePrecreateResponse response = result.getResponse();dumpResponse(response);//检查是否存在上传文件夹,如果不存在就赋予创建文件夹权限File folder = new File(path);if(!folder.exists()){folder.setWritable(true);folder.mkdirs();}// 需要修改为运行机器上的路径 C:\ /Users/sudo/DesktopString qrpath = String.format(path+"/qr-%s.png",response.getOutTradeNo());String qrFileName = String.format("/qr-%s.png",response.getOutTradeNo());ZxingUtils.getQRCodeImge(response.getQrCode(),256,qrpath);File targetFile = new File(path,qrFileName);try {//将生成的二维码上传到FTP服务器上FTPUtil.uploadFile(Lists.newArrayList(targetFile));} catch (IOException e) {logger.info("上传二维码异常",e);}logger.info("qrpath:" + qrpath);String qrUrl = PropertiesUtil.getProperty("ftp.server.http.prefix")+targetFile.getName();resultMap.put("qrUrl",qrUrl);return ServerResponse.createBySuccess(resultMap);case FAILED:logger.error("支付宝预下单失败!!!");return ServerResponse.createByErrorMessage("支付宝预下单失败!!!");case UNKNOWN:logger.error("系统异常,预下单状态未知!!!");return ServerResponse.createByErrorMessage("系统异常,预下单状态未知!!!");default:logger.error("不支持的交易状态,交易返回异常!!!");return ServerResponse.createByErrorMessage("不支持的交易状态,交易返回异常!!!");}}// 简单打印应答private void dumpResponse(AlipayResponse response) {if (response != null) {logger.info(String.format("code:%s, msg:%s", response.getCode(), response.getMsg()));if (StringUtils.isNotEmpty(response.getSubCode())) {logger.info(String.format("subCode:%s, subMsg:%s", response.getSubCode(),response.getSubMsg()));}logger.info("body:" + response.getBody());}}

我们会发现,上面的大多数是直接从支付宝Demo中的Main类中复制过来的,

我们只是更改了对应的参数

上面第四行代码我们用到了自己封装了一个根据订单号和用户Id来查询订单的方法:

*Mapper

//根据订单号和用户的Id来查询订单Order selectByUserIdAndOrderNo(@Param("userId") Integer userId,@Param("orderNo") Long orderNo);

*Mapper.xml

<select id="selectByUserIdAndOrderNo" parameterType="map" resultMap="BaseResultMap">select<include refid="Base_Column_List"/>from mmall_orderwhere order_no = #{orderNo}and user_id = #{userId}</select>

2、支付接口测试:
image.png

用沙箱版支付宝扫描支付我们生成的二维码,发现可以啦~

image.png

25 【支付模块开发】——将配置好的支付宝沙箱环境集成到我们的项目中以及支付接口的编写...

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。