Java开发支付宝PC支付完整版

一:准备工作

1:如没有账号的请先去 支付宝商户平台 注册商户号

2:开发前需要导入支付宝SDK 支付宝SDK下载链接 Maven依赖也在里面

3:生成支付宝密钥、公钥,需要用到支付宝密钥生成工具 密钥生成工具下载链接 ,密钥用于签名使用

4:电脑网站支付结果异步通知(关于支付结果异步通知后续会专门写一个博客,需要重点注意)

注意:请先详细查看官方文档按步骤开发,一切以官方文档为主 支付宝官方开发文档,如使用老接口请移步 老版即时到账文档

5:测试的时候一定要使用内网穿透软件,否则会报错

二:开发代码

博主使用的是沙箱环境,正式上线时请将环境改为正式环境

AlipayConfig:

public class AlipayConfig {
  public static String APPID = "";

  //用支付宝密钥生成工具生成的私钥
  public static String RSA_PRIVATE_KEY = "";

  //电脑网站支付结果异步通知,可以参考异步文档,一定要是外网能访问的
  public static String notify_url = ""; 

  //电脑网站支付结果同步通知,用于转跳到用户自己的页面,一定要是外网能访问的
  public static String return_url = ""; 

  //沙箱接口,正式上线时请改用正式支付接口
  public static String URL = "https://openapi.alipaydev.com/gateway.do";
  public static String CHARSET = "UTF-8";
  public static String FORMAT = "json";

  //用支付宝密钥生成工具生成的公钥
  public static String ALIPAY_PUBLIC_KEY = "";
  public static String log_path = "/log";
  public static String SIGNTYPE = "RSA2";

  public AlipayConfig() {
  }
}

AlipayService:

public interface AlipayService {
  public String toAlipay(Map<String, String> sourceMap) throws IOException;
}

AlipayServiceImpl:

@Service
public class AlipayServiceImpl implements AlipayService {

  @Override
  public String toAlipay(Map<String, String> sourceMap) throws IOException {
    AlipayClient alipayClient = new DefaultAlipayClient(AlipayConfig.URL,AlipayConfig.APPID,AlipayConfig.RSA_PRIVATE_KEY,AlipayConfig.FORMAT,AlipayConfig.CHARSET,AlipayConfig.ALIPAY_PUBLIC_KEY,AlipayConfig.SIGNTYPE);
    AlipayTradePagePayRequest alipayRequest = new AlipayTradePagePayRequest();
    alipayRequest.setReturnUrl(AlipayConfig.return_url);
    alipayRequest.setNotifyUrl(AlipayConfig.notify_url);
    AlipayTradeWapPayModel alipayTradeWapPayModel = new AlipayTradeWapPayModel();
    alipayTradeWapPayModel.setOutTradeNo(sourceMap.get("out_trade_no"));
    alipayTradeWapPayModel.setProductCode("FAST_INSTANT_TRADE_PAY");
    alipayTradeWapPayModel.setTotalAmount(sourceMap.get("total_amount"));
    alipayTradeWapPayModel.setSubject("Alipay");
    alipayTradeWapPayModel.setBody(sourceMap.get("body"));
    alipayRequest.setBizModel(alipayTradeWapPayModel);
    String form="";
    try {
      form = alipayClient.pageExecute(alipayRequest).getBody();
    } catch (AlipayApiException e) {
      e.printStackTrace();
    }
    return form;
  }

}

AlipayController:

@Controller
public class AlipayController {

  @Autowired
  public AlipayService alipayService;

  @RequestMapping("pay")
  public void toAlipay(HttpServletRequest httpRequest , HttpServletResponse httpResponse, String payId, String totalFee, String body) throws IOException {

    //生成一笔支付记录,支付完成时将支付状态改为成功

    Map<String, String> sourceMap = new HashMap<>();
    sourceMap.put("out_trade_no",payId);
    sourceMap.put("total_amount",totalFee);
    sourceMap.put("body",getUTF8XMLString(body));

    String form = alipayService.toAlipay(sourceMap);
    httpResponse.setContentType("text/html;charset=" + AlipayConfig.CHARSET);
    httpResponse.getWriter().write(form);
    httpResponse.getWriter().flush();
    httpResponse.getWriter().close();
  }

  //注意异步返回结果通知是以post请求形式返回的
  @RequestMapping("notifyUrl")
  public String notify_url(HttpServletRequest request){
    Map<String, String> paramsMap = convertRequestParamsToMap(request);
    String out_trade_no= paramsMap.get("out_trade_no");
    try {
      boolean signVerified = AlipaySignature.rsaCheckV1(paramsMap, AlipayConfig.ALIPAY_PUBLIC_KEY, AlipayConfig.CHARSET, AlipayConfig.SIGNTYPE);
      //无论同步异步都要验证签名
      if(signVerified){
        if(trade_status.equals("TRADE_FINISHED") || trade_status.equals("TRADE_SUCCESS")){
          //处理自己系统的业务逻辑,如:将支付记录状态改为成功,需要返回一个字符串success告知支付宝服务器

          return "success";
        } else {
          //支付失败不处理业务逻辑
          return "failure";
        }
      }else {
        //签名验证失败不处理业务逻辑
        return "failure";
      }
    } catch (AlipayApiException e) {
      e.printStackTrace();
      return "failure";
    }
  }

  //注意同步返回结果是以get请求形式返回的
  @RequestMapping("returnUrl")
  public String return_url(HttpServletRequest request){
    Map<String, String> paramsMap = convertRequestParamsToMap(request);
    try {
      boolean signVerified = AlipaySignature.rsaCheckV1(paramsMap, AlipayConfig.ALIPAY_PUBLIC_KEY, AlipayConfig.CHARSET, AlipayConfig.SIGNTYPE);
      if(signVerified){
        //跳转支付成功界面
        return "支付成功页面";

      }else {
        //跳转支付失败界面
        return "failure";
      }
    } catch (AlipayApiException e) {
      e.printStackTrace();
    }
    return "success";
  }

  //将请求中的参数转换为Map
  public static Map<String, String> convertRequestParamsToMap(HttpServletRequest request) {
    Map<String, String> retMap = new HashMap();
    Set<Entry<String, String[]>> entrySet = request.getParameterMap().entrySet();
    Iterator var3 = entrySet.iterator();

    while(true) {
      while(var3.hasNext()) {
        Entry<String, String[]> entry = (Entry)var3.next();
        String name = (String)entry.getKey();
        String[] values = (String[])entry.getValue();
        int valLen = values.length;
        if(valLen == 1) {
          retMap.put(name, values[0]);
        } else if(valLen <= 1) {
          retMap.put(name, "");
        } else {
          StringBuilder sb = new StringBuilder();
          String[] var9 = values;
          int var10 = values.length;

          for(int var11 = 0; var11 < var10; ++var11) {
            String val = var9[var11];
            sb.append(",").append(val);
          }

          retMap.put(name, sb.toString().substring(1));
        }
      }

      return retMap;
    }
  }

  //将字符串转换为UTF-8编码以防出现乱码错误
  public static String getUTF8XMLString(String xml) {
    StringBuffer sb = new StringBuffer();
    sb.append(xml);
    String xmString = "";
    String xmlUTF8="";
    try {
      xmString = new String(sb.toString().getBytes("UTF-8"));
      xmlUTF8 = URLEncoder.encode(xmString, "UTF-8");
    } catch (UnsupportedEncodingException e) {
      e.printStackTrace();
    }
    return xmlUTF8;
  }
}

至此代码已经完成!!!

三:演示结果

注意:扫码或者登陆账户时如果用的是沙箱开发环境请使用沙盒支付宝APP扫码,或者使用沙盒账户支付,否则会弹出码已失效错误

支付宝沙箱

支付成功页面是从支付结果同步通知controller中跳转的,后续会更新最详细最完整的微信Navicat支付跟PayPal支付,有兴趣请关注博主

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持我们。

(0)

相关推荐

  • Java将微信和支付宝支付的个二维码合二为一的方法

    因公司需要将支付宝和微信的二维码合成一个,不管用户用支付宝扫还是微信扫都能打开对应的支付页面,在网上找了一些文章,很感谢各位大神的经验,我也记录下我是如何将两个二维码合二为一的~. 原理:支付宝或微信生成的二维码中本质都内嵌了一个url,在扫码时实际是定向去访问二维码中内嵌的url,这样我就可以将这个url指定到我的一个控制器,在控制器中判断是微信还是支付宝软件扫的,然后去唤醒各自的支付即可. 1.首先生成二维码: folderName:存储二维码图片的文件夹名 imageName:二维码图片名

  • java版微信和支付宝退款接口

    本文实例为大家分享了java微信退款接口和支付宝退款接口的具体代码,供大家参考,具体内容如下 1.微信退款接口  相对来说我感觉微信的退款接口还是比较好调用的,直接发送httppost请求即可: /** * * 微信退款 * @param transaction_id 微信支付订单号 * @param out_refund_no 商户订单号 * @param total_fee 总金额 * @param refund_fee 退款金额 * @param op_user_id 操作人 * @ret

  • java后台实现支付宝对账功能的示例代码

    完成支付宝支付.查询的接口之后,我们应该还需要定时与支付宝进行对账,以确保商户系统的订单信息是正确的,想知道支付宝支付.查询接口实现过程的亲们,可移步到上一篇有详细过程. 现在我们来讲一下支付宝对账的功能,关于与支付宝交互的关键代码,其实支付宝的API已经讲得很清楚,如果亲们想直接看支付宝API,点击 支付宝对账API,当然我在文章也会进行说明解释. 实现支付宝自动对账功能 先看一下商户系统和支付宝的大概交互过程: 所谓对账,其实就是调用支付宝查询接口,跟上一篇的查询接口不同的是,上一篇的查询接

  • java服务器端微信、支付宝支付和退款功能

    工作需要,写了服务器端的支付和退款功能,包含微信和支付宝,网上也有很多demo可以借鉴,我把我的代码放出来,写的比较简单,有问题的欢迎指正,大家一起学习. 微信支付需要调用微信的统一下单接口,而支付宝不用. 我写的时候微信和支付宝都单独写了一个工具类,来调用支付,给前端返回需要的数据. ps:支付是可以不需要服务器端的,不过为了安全一点点,所以前端需要调起支付的字段都直接从服务器端返回,前端拿到字段直接调起支付就可以了. Map<String,String> map = new HashMap

  • java实现在SSM下使用支付宝扫码支付功能

    本文实例为大家分享了java使用支付宝扫码支付的具体代码,供大家参考,具体内容如下 准备工作 首先开通支付宝沙箱的测试账号,里面会有消费者账户和收款方账户 手机扫码下载手机端app 基础配置 所需jar包 AlipayConfig package com.alipay.config; import java.io.FileWriter; import java.io.IOException; import java.util.ResourceBundle; /* * *类名:AlipayConf

  • java实现支付宝退款功能

    最近完成的差不多的项目突然需要加退款的流程需求了,所以来小小的实现以下. 其实对比其他的支付和退款来说,支付宝算是特别专业,也是特别简单的一个了. 一.引入支付宝SDK 在这里说一下,其实每种支付都会有一个官方带的SDK,我们可以把这个sdk引入到我们的项目中去,然后我们就可以调用里面的方法和对象,给里面传值,进行我们相应的请求的访问和介入. 首先引入如上图所示的jar包,然后我们就算是成功了一半了. 下载地址 然后我们需要把这个jar包引入到所需要的地方,这里不做过多的描述. 二.找到需要的资

  • java支付宝即时到帐提交订单功能

    本文实例为大家分享了java支付宝即时到帐提交订单的具体代码,供大家参考,具体内容如下 package com.tian.batis; import java.io.UnsupportedEncodingException; import java.net.URLEncoder; import java.util.ArrayList; import java.util.Collections; import java.util.HashMap; import java.util.List; im

  • java 商户PC端接入支付宝支付的实现方法

    用户在商户网站上完成支付一.商户申请流程和业务场景即时到账:网上交易时,买家的交易资金直接打入卖家支付宝账户,快速回笼交易资金.申请条件: 1) 申请前必须拥有经过实名认证的支付宝账户: 2) 企业或个体工商户可申请: 3) 需提供真实有效的营业执照,且支付宝账户名称需与营业执照主体一致: 4) 网站能正常访问且页面显示完整,网站需要明确经营内容且有完整的商品信息: 5) 网站必须通过ICP备案.如为个体工商户,网站备案主体需要与支付宝账户主体名称一致: 6) 如为个体工商户,则团购不开放,且古

  • Java判断浏览器是微信还是支付宝

    下面一段代码给大家介绍java判断浏览器是微信还是支付宝,具体代码如下所示: @RequestMapping("getBrowser.do") public String getBrowser(HttpServletRequest req, HttpServletResponse resp) { String userAgent = req.getHeader("user-agent"); if (userAgent != null && userA

  • Java开发支付宝PC支付完整版

    一:准备工作 1:如没有账号的请先去 支付宝商户平台 注册商户号 2:开发前需要导入支付宝SDK 支付宝SDK下载链接 Maven依赖也在里面 3:生成支付宝密钥.公钥,需要用到支付宝密钥生成工具 密钥生成工具下载链接 ,密钥用于签名使用 4:电脑网站支付结果异步通知(关于支付结果异步通知后续会专门写一个博客,需要重点注意) 注意:请先详细查看官方文档按步骤开发,一切以官方文档为主 支付宝官方开发文档,如使用老接口请移步 老版即时到账文档 5:测试的时候一定要使用内网穿透软件,否则会报错 二:开

  • Java开发微信Navicat支付完整版

    一:准备工作 1:先去微信公众平台注册一个公众号,选择服务号 2:去微信商户平台注册一个商户号,用于收款 3:在商户号中配置对应的公众号的APPID 4:支付结果异步通知(需要重点注意) 注意:请先详细查看官方文档按步骤开发,一切以官方文档为主 微信Navicat支付官方文档 5:测试的时候一定要使用内网穿透软件,否则回调时会报错  二:开发代码 WeChatPayConfig: public class WeChatPayConfig { //公众号APPID private String A

  • Java SpringMVC实现PC端网页微信扫码支付(完整版)

    一:前期微信支付扫盲知识 前提条件是已经有申请了微信支付功能的公众号,然后我们需要得到公众号APPID和微信商户号,这个分别在微信公众号和微信支付商家平台上面可以发现.其实在你申请成功支付功能之后,微信会通过邮件把Mail转给你的,有了这些信息之后,我们就可以去微信支付服务支持页面:https://pay.weixin.qq.com/service_provider/index.shtml 打开这个页面,点击右上方的链接[开发文档]会进入到API文档说明页面,看起来如下 选择红色圆圈的扫码支付就

  • php实现小程序支付完整版

    本文实例为大家分享了php实现小程序支付的具体代码,供大家参考,具体内容如下 环境: tp3.2  + 小程序 微信支付功能开通 Step1:  下载PHP 支付SDK(下载地址)  放到Library\Vendor下,取名Wxpay 修改WxPay.Config.php 里的appid appsecret key MCHID Step2: 小程序 js 代码: var url = getApp().globalData.httpServer + 'api/buy/pay'; var userI

  • java仿windows记事本功能完整版

    最近学了Java编程,就编了仿windows系统下的记事本练练手,这个记事本实现了windows系统下的大部分功能,只有很少的部分没有实现,比如撤销命令的不完美,这是本人的能力有限,还有那些JMenuItem的是否可用问题,这只是本人比较偷懒,无心再去实现,希望能够与广大的Java爱好者分享我的代码,共同学习进步,我肯定有不足之处,比如有些代码的重复,代码的布置,以及变量的取名问题,希望广大的Java大牛多提宝贵意见,话不多少,直接上代码! package org.mfy.notepad; im

  • 微信公众平台开发接口PHP SDK完整版

    代码如下: 更新日志: 2013-01-01 版本1.02014-03-15 增加图片.视频.语音的内容回复2014-04-09 增加菜单链接事件2014-04-10 修改文本回复的判定方法 复制代码 代码如下: <?php/*    方倍工作室    CopyRight 2014 All Rights Reserved*/ define("TOKEN", "weixin"); $wechatObj = new wechatCallbackapiTest();

  • java开发微信公众号支付

    最近做了微信公众号支付的开发,由于是第一次做也摸索了几天的时间,也只是达到了实现功能的水平,并没有太多考虑到性能问题,所以这篇文章比较适合初学者. 微信公众号支付的总体其实很简单,大致就分为三步.第一步需要获取用户授权:第二步调用统一下单接口获取预支付id:第三步H5调起微信支付的内置的js.下面介绍具体每一步的开发流程. 一    首先要明确微信公众号支付属于网页版支付,所以相较于app的直接调取微信支付要多一步微信授权.也就是需要获取用户的openid.微信公众号使用的交易类型是JSAPI,

  • java对接支付宝支付接口开发详细步骤

    目录 第一步 第二步 第三步 第四步 对接支付宝支付接口,官方文档已经写的很清楚了,但是也有很多像我一样的小白,第一次对接支付宝支付接口,会有些迷茫,所以我在此写下这篇文章,给我和我一样的同学,一点思路吧. 第一步 (先要在支付宝进行操做,拿到我们需要开发的信息后在动代码) 进入蚂蚁金服,我们先要创建应用 看到图下的应用按钮了吗? 点击应用(如下图) 创建应用(创建应用需要审核)提供资料审核吧,这个时候我们就不用管他了.审核通过就可以用了. 但是他审核我们也不能闲着着 ,我们先弄个测试把代码写出

  • Java后端对接微信支付(小程序、APP、PC端扫码)包含查单退款

    首先我们要明确目标,我们点击微信支付官网,我们主要聚焦于这三种支付方式,其中JSPAI与APP主要与uniapp开发微信小程序与APP对接,而NATIVE主要与网页端扫码支付对接 1.三种支付统一准备工作 建议导入这个jar,里面一些提供map和xml互转以及生成签名的函数,使用非常方便. <dependency> <groupId>com.github.wxpay</groupId> <artifactId>wxpay-sdk</artifactId

  • 基于OpenCart 开发支付宝,财付通,微信支付参数错误问题

    最近在给OpenCart集成支付宝,财付通和微信扫码支付,其实这些插件都是有的卖的,但是还蛮贵的,还是自己开发集成吧,省钱.但是集成过程中发现了一些坑,有opencart的坑,也有支付sdk的坑,浪费了不少时间,这里整理几条,给需要的人跨坑. 1.微信native 模式二中的notify_url 地址必须是公网地址 2.支付宝的notify_url不能是query string的形式,比如 xxx/notify.php?route=a/b,只能为xxx/notify.php 3.OpenCart

随机推荐