前言

支付宝支付—沙箱环境使用
支付宝支付-支付宝PC端扫码支付「本文
支付宝支付-手机浏览器H5支付「待写

PC端扫码支付,其实就是就是 电脑网站支付,本文基于支付宝沙箱环境,不了解的可以看一下上边的链接。

废话不多说,直接进入主题。

下载运行测试Demo

官方Demo下载链接:电脑网站支付(Java)

下载后导入 IDEA 中运行如下图所示:

如果在导入运行过程遇到错误,请参考这篇文章:IDEA中导入支付宝电脑网站支付测试Demo遇到的错误

进行支付测试,注意付款要用沙箱环境提供的支付宝APK

Maven项目中使用

pom.xml中引入支付宝sdk依赖

<dependency><groupId>com.alipay.sdk</groupId><artifactId>alipay-sdk-java</artifactId><version>3.1.0</version>
</dependency>

配置可以单独创建一个类,静态初始化参数:

public class AlipayConfig {// [沙箱环境]应用ID,您的APPID,收款账号既是您的APPID对应支付宝账号public static String app_id = "";// [沙箱环境]商户私钥,您的PKCS8格式RSA2私钥public static String merchant_private_key = "";// [沙箱环境]支付宝公钥,查看地址:https://openhome.alipay.com/platform/keyManage.htm 对应APPID下的支付宝公钥。public static String alipay_public_key = "";// [沙箱环境]服务器异步通知页面路径  需http://格式的完整路径,不能加?id=123这类自定义参数,必须外网可以正常访问public static String notify_url = "http://ngrok.sscai.club/alipay/aliPayNotify_url";// [沙箱环境]页面跳转同步通知页面路径 需http://格式的完整路径,不能加?id=123这类自定义参数,必须外网可以正常访问public static String return_url = "http://ngrok.sscai.club/index.html#/alipay/success";// [沙箱环境]public static String gatewayUrl = "https://openapi.alipaydev.com/gateway.do";
}

至于接口啥的基本就是可以参考上方运行的Demo了。

简单看看生成支付宝订单「没有使用开源SDK」。

@Transactional
public String alipayOrder(AlipayOrderRequest alipayOrderRequest) throws AlipayApiException {//获得初始化的AlipayClientAlipayClient alipayClient = new DefaultAlipayClient(AlipayConfig.gatewayUrl,AlipayConfig.app_id,AlipayConfig.merchant_private_key,"json",AlipayConfig.charset,AlipayConfig.alipay_public_key,AlipayConfig.sign_type);//设置请求参数String payType = alipayOrderRequest.getPayType();// pageAlipayTradePagePayRequest alipayPageRequest = new AlipayTradePagePayRequest();alipayPageRequest.setReturnUrl(AlipayConfig.return_url);alipayPageRequest.setNotifyUrl(AlipayConfig.notify_url);//商户订单号,商户网站订单系统中唯一订单号,必填String out_trade_no = alipayOrderRequest.getWidOutTradeNo();//付款金额,必填String total_amount = alipayOrderRequest.getWidTotalFee();//订单名称,必填String subject = alipayOrderRequest.getWidSubject();//商品描述,可空String body = alipayOrderRequest.getWIDbody();//拼接参数alipayPageRequest.setBizContent("{\"out_trade_no\":\""+ out_trade_no +"\","+ "\"total_amount\":\""+ total_amount +"\","+ "\"subject\":\""+ subject +"\","+ "\"body\":\""+ body +"\","+ "\"product_code\":\"FAST_INSTANT_TRADE_PAY\"}");// 发起请求return alipayClient.pageExecute(alipayPageRequest).getBody();
}

网站支付接口调用后返回的是一个 Form 表单,也就是 result 实际是一段 Html 代码,然后把 result 传给前段调用即可,下面是返回的 Form 的一个示例:

  <form name="punchout_form" method="post" action="https://openapi.alipaydev.com/gateway.do?charset=UTF-8&amp;method=alipay.trade.wap.pay&amp;sign=xx&amp;return_url=http%3A%2F%2Fngrok.sscai.club%2Falipay_trade_wap_pay_java_utf_8_war_exploded%2Freturn_url.jsp&amp;notify_url=http%3A%2F%2Fngrok.sscai.club%2Falipay_trade_wap_pay_java_utf_8_war_exploded%2Fnotify_url.jsp&amp;version=1.0&amp;app_id=2016101700705301&amp;sign_type=RSA2&amp;timestamp=2020-01-08+14%3A09%3A58&amp;alipay_sdk=alipay-sdk-java-3.3.0&amp;format=json"> <input type="hidden" name="biz_content" value="{&quot;body&quot;:&quot;购买测试商品0.01元&quot;,&quot;out_trade_no&quot;:&quot;20201814955421&quot;,&quot;product_code&quot;:&quot;QUICK_WAP_WAY&quot;,&quot;subject&quot;:&quot;电脑网站支付测试商品&quot;,&quot;timeout_express&quot;:&quot;2m&quot;,&quot;total_amount&quot;:&quot;0.01&quot;}" /> <input type="submit" value="立即支付" style="display:none" /> </form>

怎么调用呢?下面是一段我在vue中的测试代码片段,前段接收到后端返回的 Form 表单进行提交:

const div = document.createElement('div');
console.log("我是后端返回的数据:"+res.result)
div.innerHTML = res.result;
document.body.appendChild(div);
console.log("punchout_form:"+document.forms.punchout_form)
document.forms.punchout_form.submit();

支付成功后会自动重定向到配置的跳转界面,由后端的的 return_url 参数控制。

再看看支付成功后的回调接口「没有使用开源的SDK演示」:

public String alipaynotify(Model model, HttpServletRequest request) {log.info("支付宝异步回调 ------------beg-----------");String result = "fail";//获取支付宝POST过来反馈信息/* ** 功能:支付宝服务器异步通知页面* 说明:* 以下代码只是为了方便商户测试而提供的样例代码,商户可以根据自己网站的需要,按照技术文档编写,并非一定要使用该代码。* 该代码仅供学习和研究支付宝接口使用,只是提供一个参考。*/Map<String, String> params=this.getAlipayRequest(request);if(params == null || params.size()==0){BufferedReader bufferReader = null;StringBuilder sb = new StringBuilder();try {bufferReader = new BufferedReader(request.getReader());String line = null;while ((line = bufferReader.readLine()) != null) {sb.append(new String(line.getBytes("ISO-8859-1"), "utf-8"));}} catch (IOException e) {e.printStackTrace();}String body= null;try {body = URLDecoder.decode(sb.toString(),"UTF-8");} catch (UnsupportedEncodingException e) {e.printStackTrace();}params=UriComponentsBuilder.newInstance().query(body).build().getQueryParams().toSingleValueMap();}boolean signVerified =false;try {signVerified = AlipaySignature.rsaCheckV1(params, AlipayConfig.alipay_public_key, AlipayConfig.charset, AlipayConfig.sign_type);} catch (AlipayApiException e1) {// TODO Auto-generated catch blocklog.error("由于"+e1.getErrMsg()+"返回给支付宝系统的结果result:fail");model.addAttribute("result", "fail");return result;} //调用SDK验证签名//——请在这里编写您的程序(以下代码仅作参考)——/* 实际验证过程建议商户务必添加以下校验:1、需要验证该通知数据中的out_trade_no是否为商户系统中创建的订单号,2、判断total_amount是否确实为该订单的实际金额(即商户订单创建时的金额),3、校验通知中的seller_id(或者seller_email) 是否为out_trade_no这笔单据的对应的操作方(有的时候,一个商户可能有多个seller_id/seller_email)4、验证app_id是否为该商户本身。*/log.error("支付宝验证签名:---------------------------------"+signVerified);if(signVerified) {//验证成功//商户订单号//交易状态log.info("支付宝异步回调验签成功!");String trade_status = params.get("trade_status");if("TRADE_FINISHED".equals(trade_status)){//判断该笔订单是否在商户网站中已经做过处理//如果没有做过处理,根据订单号(out_trade_no)在商户网站的订单系统中查到该笔订单的详细,并执行商户的业务程序//如果有做过处理,不执行商户的业务程序//注意://退款日期超过可退款期限后(如三个月可退款),支付宝系统发送该交易状态通知try {// 在这里处理支付成功后的操作,比如修改订单状态等等coding...result = "success";} catch (Exception e) {log.error(e.getMessage());result = "fail";}}else if ("TRADE_SUCCESS".equals(trade_status)){//判断该笔订单是否在商户网站中已经做过处理//如果没有做过处理,根据订单号(out_trade_no)在商户网站的订单系统中查到该笔订单的详细,并执行商户的业务程序//如果有做过处理,不执行商户的业务程序//注意://付款完成后,支付宝系统发送该交易状态通知try {// 在这里处理支付成功后的操作,比如修改订单状态等等coding...result = "success";} catch (Exception e) {log.error(e.getMessage());result = "fail";}}else{result = "fail";}}else {//验证失败result = "fail";//调试用,写文本函数记录程序运行情况是否正常//String sWord = AlipaySignature.getSignCheckContentV1(params);//AlipayConfig.logResult(sWord);log.debug("支付宝异步回调验签失败");}log.debug("异步回调返回给支付宝系统的结果result:"+result);model.addAttribute("result", result);log.info("支付宝异步回调  -------------end ------------");return result;
}

该方法返回给支付宝的 resultsuccessfail 两个结果。

从以上看来,其实不难发现支付宝支付是非常简单的,尽管我上边贴了大量的代码,其实采用开源SDK的话可以更加缩减、美化一些。

ok,这篇文章就到这结束了,上边并没有详细介绍接口调用、参数说明等,详细介绍请查看官方文档:https://docs.open.alipay.com/270/105902/

官方测试Demo下载

上方可运行的官方支付Demo:https://www.lanzous.com/i8qjxij

求关注,求推荐

博客地址:https://www.cnblogs.com/niceyoo

求关注❤️,求推荐

支付宝支付-支付宝PC端扫码支付相关推荐

  1. 微信支付—微信H5支付「PC端扫码支付」

    前言 微信支付-微信H5外部浏览器支付 微信支付-微信H5内部浏览器支付 微信支付-PC端扫码支付「本文」 本篇是微信支付系列的第三篇,PC端扫码支付. 开发环境:Java + SpringBoot ...

  2. 微信支付之pc端扫码支付

    支付不用说直接看文档:https://developers.weixin.qq.com/doc/oplatform/Website_App/WeChat_Login/Wechat_Login.html ...

  3. PHP 支付PC端扫码支付、APP接口调起支付宝支付、微信公众号接入支付宝支付

    第一:第三方支付原理 第二:支付接口申请流程 地址:https://docs.open.alipay.com/270/105899/ : 参考地址:https://blog.csdn.net/nove ...

  4. 微信PC端扫码支付 java 模式二的扫码支付

    前言 这次分享的是java对接微信的支付接口,实现电脑端扫码支付后,跳转支付成功页面的例子.之所以分享是微信的Api太坑了.留下的文档也少,对接过程中容易出现各种各样的问题,在实现这扫码支付功能的时候 ...

  5. JAVA PC端扫码支付(一)微信支付

    微信支付从配置到开发 一.配置 1.开通公众平台支付功能 商户号 微信支付功能先要申请微信(企业)公众平台,然后开通企业公众平台付功能.下图为微信(企业)公众平台页面,可以看到商户号等信息 微信公众号 ...

  6. PHP项目集成支付宝PC端扫码支付API(国内支付)

    一.PC端(电脑端)网站扫码支付接口申请流程 1. 注册是支付宝商家账号 -- 注册地址: 2. 注册成功后,找到蚂蚁金服开放平台,点击支付应用: 3. 创建应用 4. 添加应用中的电脑支付功能 5. ...

  7. 微信pc端扫码支付前后端流程(Node.js)

    大致流程 不必须事先微信登录, 后台发送本次交易的数据到微信联合支付接口, 返回一个微信提供的交易二维码url, 将这个url返回给前端 前端将这个地址转换成一个二维码, 并且开启一个轮询(或webs ...

  8. 支付宝支付-当面付之扫码支付「扫码支付」

    前言 支付宝支付-沙箱环境使用 支付宝支付-支付宝PC端扫码支付 支付宝支付-手机浏览器H5支付 支付宝支付-当面付之扫码支付「本文」 当面付包含两种支付方式:商品条形码支付 + 扫码支付 经过前面两 ...

  9. Java后端对接微信支付(微信小程序、APP、PC端扫码)非常全,包含查单、退款

    首先我们要明确目标,我们点击 微信支付官网 ,我们主要聚焦于这三种支付方式,其中JSPAI与APP主要与uniapp开发微信小程序与APP对接,而NATIVE主要与网页端扫码支付对接 1.三种支付统一 ...

最新文章

  1. wifiphisher 钓鱼工具的使用
  2. linux shell ascii 字符 转换
  3. HDU 1513 Palindrome(最长公共子序列)
  4. 【Python-ML】SKlearn库密度聚类DBSCAN模型
  5. linux下的makefile编程
  6. 修改数据库mysql字符编码为UTF8
  7. Protobuf序列化的原理-负数的存储
  8. Avalonia跨平台入门第十二篇之动画效果
  9. php让符合条件的复选框选中,多条件查询(复选框条件)
  10. 移动端调取摄像头上面如何给出框_智能AI助力家居安防,创维小湃高清智能摄像头...
  11. 第二章 Jsp基本语法
  12. 麻辣江湖服务器正在维护,7月18日例行维护更新公告
  13. SuperMap iDesktop / iDesktopX 加载大疆智图(DJI Terra)导出的OSGB数据效果异常的绕行方案
  14. 邵阳计算机学院高考班成绩,邵阳这个学校出了一个“牛班”,“火箭班”考生本科上线率100%!...
  15. 基于springboot的医院体检预约管理系统
  16. SICK LMS511 LiDAR系统集成
  17. 想破解游戏协议?你知道客户端和服务器是怎么通信的?我来告诉你怎么定义的
  18. 2017年18岁的北京文科状元父母都是外交官,关于高考,他说出了我们竭力回避的戳心真相
  19. 动态投资回收期Pt小于计算期n
  20. 公众号模板消息 跳转小程序报错invalid weapp pagepath解决方法

热门文章

  1. [vue] SPA单页面的实现方式有哪些?
  2. [css] 手写一个满屏品字布局的方案
  3. [css] 写出几个初始化CSS的样式,并解释说明为什么要这样写
  4. [css] 你是怎样对css文件进行压缩合并的?
  5. [css] css的加载会阻塞DOM树解析和渲染吗?为什么
  6. [vue-element] ElementUI是怎么做表单验证的?在循环里对每个input验证怎么做呢?
  7. 前端学习(2566):vue的生命周期
  8. mybatis学习(40):逆向工程的创建
  9. java学习(40):成员实例的定义和访问
  10. 包r语言_R语言交互式可视化包CanvasXpress