摘要:最近的一个项目中涉及到了支付业务,其中用到了微信支付和支付宝支付,在做的过程中也遇到些问题,正好马上放假了,公司不忙了,所以现在总结梳理一下,分享给有需要的人,也为自己以后回顾留个思路。

一:支付宝支付接入准备工作:

首先,支付宝支付和微信支付意愿,都是只支持企业用户,个人用户是不能接入支付宝支付的,所以要想接入支付宝支付,首先需要有支付宝的企业账号,有了企业账号才能拿到支付宝支付的所需参数,这些工作都是需要公司层面的人操作的,作为码农,只管拿到这些需要的参数就可以进行看文档,对接支付支付接口了。那支付宝支付都需要哪些参数呢,请看下面:

// 支付宝支付参数配置 //@Value("${ALIPAY.APPID}")protected String app_id;//应用ID,您的APPID,收款账号既是您的APPID对应支付宝账号@Value("${ALIPAY.PRIVATEKEY}")protected String merchant_private_key;//商户私钥,您的PKCS8格式RSA2私钥@Value("${ALIPAY.PUBLICKEY}")protected String alipay_public_key;//支付宝公钥,查看地址:https://openhome.alipay.com/platform/keyManage.htm 对应APPID下的支付宝公钥。@Value("${ALIPAY.NOTIFY_URL}")protected String notify_url;//服务器异步通知页面路径@Value("${ALIPAY.RETURNA_URL}")protected String return_url;//页面跳转同步通知页面路径@Value("${ALIPAY.SIGN}")protected String sign_type = "RSA2";//签名方式protected String charset = "utf-8";//字符编码格式@Value("${ALIPAY.GATEWAY_URL}")protected String gateway_url;//支付宝网关

上面就是支付宝支付需要的各类参数,在开始写代码之前,需要先把这些参数配置好才能进行下面的工作。

二:支付宝(电脑网站支付)接口说明:

首页访问支付宝的开放平台:电脑网站支付 | 支付应用,然后查看快速接入文档,首先是创建应用,然后是配置密钥,最好是搭建和配置开放环境。配置好上面的各项工作,下面来看下支付宝支付的接口说明:

alipay.trade.page.pay(PC场景下单并支付)

支付流程

公共参数

请求地址:

环境 HTTPS请求地址
正式环境 支付宝 - 网上支付 安全快速!

公共请求参数:

参数 类型 是否必填 最大长度 描述 示例值
app_id String 32 支付宝分配给开发者的应用ID 2014072300007148
method String 128 接口名称 alipay.trade.page.pay
format String 40 仅支持JSON JSON
return_url String 256 同步返回地址,HTTP/HTTPS开头字符串 支付宝
charset String 10 请求使用的编码格式,如utf-8,gbk,gb2312等 utf-8
sign_type String 10 商户生成签名字符串所使用的签名算法类型,目前支持RSA2和RSA,推荐使用RSA2 RSA2
sign String 256 商户请求参数的签名串,详见签名 详见示例
timestamp String 19 发送请求的时间,格式"yyyy-MM-dd HH:mm:ss" 2014-07-24 03:07:50
version String 3 调用的接口版本,固定为:1.0 1.0
notify_url String 256 支付宝服务器主动通知商户服务器里指定的页面http/https路径。 https://api.xx.com/receive_notify.htm
biz_content String - 业务请求参数的集合,最大长度不限,除公共参数外所有请求参数都必须放在这个参数中传递,具体参照各产品快速接入文档

请求参数

参数

类型

是否必填

最大长度

描述

示例值

out_trade_no

String

64

商户订单号,64个字符以内、可包含字母、数字、下划线;需保证在商户端不重复

20150320010101001

product_code

String

64

销售产品码,与支付宝签约的产品码名称。 注:目前仅支持FAST_INSTANT_TRADE_PAY

FAST_INSTANT_TRADE_PAY

total_amount

Price

11

订单总金额,单位为元,精确到小数点后两位,取值范围[0.01,100000000]

88.88

subject

String

256

订单标题

Iphone6 16G

body

String

128

订单描述

Iphone6 16G

goods_detail

String

订单包含的商品列表信息,Json格式: {"show_url":"https://或http://打头的商品的展示地址"} ,在支付时,可点击商品名称跳转到该地址

{"show_url":"https://www.alipay.com"}

passback_params

String

512

公用回传参数,如果请求时传递了该参数,则返回给商户时会回传该参数。支付宝只会在异步通知时将该参数原样返回。本参数必须进行UrlEncode之后才可以发送给支付宝

merchantBizType%3d3C%26merchantBizNo%3d2016010101111

extend_params

String

业务扩展参数,详见业务扩展参数说明

{"sys_service_provider_id":"2088511833207846"}

goods_type

String

2

商品主类型:0—虚拟类商品,1—实物类商品(默认)
注:虚拟类商品不支持使用花呗渠道

0

timeout_express

String

6

该笔订单允许的最晚付款时间,逾期将关闭交易。取值范围:1m~15d。m-分钟,h-小时,d-天,1c-当天(1c-当天的情况下,无论交易何时创建,都在0点关闭)。 该参数数值不接受小数点, 如 1.5h,可转换为 90m。

该参数在请求到支付宝时开始计时。

90m

enable_pay_channels

String

128

可用渠道,用户只能在指定渠道范围内支付
当有多个渠道时用“,”分隔
注:与disable_pay_channels互斥

pcredit,moneyFund,debitCardExpress

disable_pay_channels

String

128

禁用渠道,用户不可用指定渠道支付
当有多个渠道时用“,”分隔
注:与enable_pay_channels互斥

pcredit,moneyFund,debitCardExpress

auth_token

String

40

获取用户授权信息,可实现如免登功能。获取方法请查阅:用户信息授权

appopenBb64d181d0146481ab6a762c00714cC27

qr_pay_mode

String

2

PC扫码支付的方式,支持前置模式和跳转模式。
前置模式是将二维码前置到商户的订单确认页的模式。需要商户在自己的页面中以iframe方式请求支付宝页面。具体分为以下几种:
0:订单码-简约前置模式,对应iframe宽度不能小于600px,高度不能小于300px;
1:订单码-前置模式,对应iframe宽度不能小于300px,高度不能小于600px;
3:订单码-迷你前置模式,对应iframe宽度不能小于75px,高度不能小于75px;
4:订单码-可定义宽度的嵌入式二维码,商户可根据需要设定二维码的大小。

跳转模式下,用户的扫码界面是由支付宝生成的,不在商户的域名下。
2:订单码-跳转模式

4

qrcode_width

String

4

商户自定义二维码宽度

注:qr_pay_mode=4时该参数生效

100

三:下载支付宝的SDK

下载地址:网页&移动应用学习路径 | 支付应用,下载后可以导入本地,然后修改对应的配置,就可以测试支付接口了

四:安装支付宝的SDKmaven依赖

由于我们准备使用支付宝提供的SDK实现支付接口的对接,所以需要把支付宝的SDK安装到我们的本地maven仓库,安装命令如下:

mvn install:install-file -DgroupId=com.alipay.api -DartifactId=alipay-sdk-java20170324180803 -Dversion=1.0.0 -Dpackaging=jar -Dfile=D://alipay-sdk-java20170324180803.jar

安装好支付宝的SDK后,就可以在maven项目里面引用该依赖了,如下:

!--支付宝SDK--><dependency><groupId>com.alipay.api</groupId><artifactId>alipay-sdk-java20170324180803</artifactId><version>1.0.0</version></dependency>

五:支付宝支付的核心代码

package com.micai.springboot.vo.pay;import java.io.Serializable;/*** @Auther: zhaoxinguo* @Date: 2018/8/30 15:14* @Description: 支付请求参数*/
public class AlipayVo implements Serializable {private static final long serialVersionUID = 1L;/*** 订单名称*/private String subject;/*** 商户网站唯一订单号*/private String out_trade_no;/*** 该笔订单允许的最晚付款时间*/private String timeout_express;/*** 付款金额*/private String total_amount;/*** 销售产品码,与支付宝签约的产品码名称*/private String product_code;public String getSubject() {return subject;}public void setSubject(String subject) {this.subject = subject;}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 getTimeout_express() {return timeout_express;}public void setTimeout_express(String timeout_express) {this.timeout_express = timeout_express;}public String getTotal_amount() {return total_amount;}public void setTotal_amount(String total_amount) {this.total_amount = total_amount;}public String getProduct_code() {return product_code;}public void setProduct_code(String product_code) {this.product_code = product_code;}
}
package com.micai.springboot.controller.pay;import com.micai.springboot.base.BaseController;
import org.springframework.beans.factory.annotation.Value;/*** @Auther: zhaoxinguo* @Date: 2018/8/31 13:40* @Description:*/
public abstract class PayBaseController extends BaseController {// 支付宝支付参数配置 //@Value("${ALIPAY.APPID}")protected String app_id;//应用ID,您的APPID,收款账号既是您的APPID对应支付宝账号@Value("${ALIPAY.PRIVATEKEY}")protected String merchant_private_key;//商户私钥,您的PKCS8格式RSA2私钥@Value("${ALIPAY.PUBLICKEY}")protected String alipay_public_key;//支付宝公钥,查看地址:https://openhome.alipay.com/platform/keyManage.htm 对应APPID下的支付宝公钥。@Value("${ALIPAY.NOTIFY_URL}")protected String notify_url;//服务器异步通知页面路径@Value("${ALIPAY.RETURNA_URL}")protected String return_url;//页面跳转同步通知页面路径@Value("${ALIPAY.SIGN}")protected String sign_type = "RSA2";//签名方式protected String charset = "utf-8";//字符编码格式@Value("${ALIPAY.GATEWAY_URL}")protected String gateway_url;//支付宝网关// 微信支付参数配置 //@Value("${WXPAY.APPID}")protected String APPID;//公众账号ID@Value("${WXPAY.MCHID}")protected String MCHID;//微信支付商户号@Value("${WXPAY.KEY}")protected String KEY;//API密钥@Value("${WXPAY.APPSECRET}")protected String APPSECRET;//AppSecret是APPID对应的接口密码@Value("${WXPAY.NOTIFY_URL}")protected String NOTIFY_URL;//回调地址。测试回调必须保证外网能访问到此地址@Value("${WXPAY.CREATE_IP}")protected String CREATE_IP;//发起请求的电脑IP}
package com.micai.springboot.controller.pay;import com.alibaba.fastjson.JSONObject;
import com.alipay.api.AlipayApiException;
import com.alipay.api.AlipayClient;
import com.alipay.api.DefaultAlipayClient;
import com.alipay.api.internal.util.AlipaySignature;
import com.alipay.api.request.AlipayTradePagePayRequest;
import com.google.gson.Gson;
import com.micai.springboot.vo.pay.AlipayVo;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;import javax.servlet.http.HttpServletRequest;
import java.io.UnsupportedEncodingException;
import java.util.HashMap;
import java.util.Iterator;
import java.util.Map;
import java.util.UUID;/*** @Auther: zhaoxinguo* @Date: 2018/8/30 15:11* @Description: 支付宝后台接口*/
@RestController
@RequestMapping(value = "/alipay")
public class AlipayController extends PayBaseController {/*** 支付网站扫码支付接口-统一下单支付接口* @return* @throws AlipayApiException*/@GetMapping("/pay")private String alipayPay() throws AlipayApiException {//这个应该是从前端端传过来的,这里为了测试就从后台写死了AlipayVo vo = new AlipayVo();vo.setOut_trade_no(UUID.randomUUID().toString().replace("-", ""));vo.setTotal_amount("0.01");vo.setSubject("nelson-test-title");vo.setProduct_code("FAST_INSTANT_TRADE_PAY"); //这个是固定的String json = new Gson().toJson(vo);logger.info("json: {}", json);AlipayClient alipayClient = new DefaultAlipayClient(gateway_url, app_id, merchant_private_key, "json",charset,alipay_public_key,sign_type);// 设置请求参数AlipayTradePagePayRequest alipayRequest = new AlipayTradePagePayRequest();alipayRequest.setReturnUrl(return_url);alipayRequest.setNotifyUrl(notify_url);alipayRequest.setBizContent(json);String result = alipayClient.pageExecute(alipayRequest).getBody();logger.info("result: {}", result);return result; //这里生成一个表单,会自动提交}/*** 支付宝服务器异步通知页面* @param request* @param out_trade_no 商户订单号* @param trade_no 支付宝交易凭证号* @param trade_status 交易状态* @return* @throws AlipayApiException*/@PostMapping("/notify")public String alipayNotify(HttpServletRequest request, String out_trade_no, String trade_no, String trade_status) throws AlipayApiException {Map<String, String> params = getParamsMap(request);logger.info("notify params: {}", JSONObject.toJSON(params));// 验证签名boolean signVerified = AlipaySignature.rsaCheckV1(params, alipay_public_key, charset, sign_type);logger.info("notify signVerified: {}", signVerified);if (signVerified) {//处理你的业务逻辑,更细订单状态等return ("success");} else {logger.info("验证失败,不去更新状态");return ("fail");}}/*** 支付宝服务器同步通知页面* @param request* @param out_trade_no 商户订单号* @param trade_no 支付宝交易凭证号* @param total_amount 交易状态* @return* @throws AlipayApiException*/@GetMapping("/return")public String alipayReturn(HttpServletRequest request, String out_trade_no,String trade_no,String total_amount) throws AlipayApiException {Map<String, String> params = getParamsMap(request);logger.info("return params: {}", JSONObject.toJSON(params));// 验证签名boolean signVerified = AlipaySignature.rsaCheckV1(params, alipay_public_key, charset, sign_type);logger.info("return signVerified: {}", signVerified);if (signVerified) {return ("success");} else {logger.info("验证失败,不去更新状态");return ("fail");}}private Map<String, String> getParamsMap(HttpServletRequest request) {Map<String,String> params = new HashMap<>();Map requestParams = request.getParameterMap();for (Iterator iter = requestParams.keySet().iterator(); iter.hasNext();) {String name = (String) iter.next();String[] values = (String[]) requestParams.get(name);String valueStr = "";for (int i = 0; i < values.length; i++) {valueStr = (i == values.length - 1) ? valueStr + values[i]: valueStr + values[i] + ",";}//乱码解决,这段代码在出现乱码时使用try {valueStr = new String(valueStr.getBytes("ISO-8859-1"), "utf-8");params.put(name, valueStr);} catch (UnsupportedEncodingException e) {e.printStackTrace();}}return params;}}

六:运行支付宝支付URL:http://dvnq2b.natappfree.cc/alipay/pay,返回如下支付二维码页面:

支付成功返回页面:

支付宝回调日志如下,其中包括了同步回调和异步回调:

七:总结:

经过上面的所以流程,相信大家都明白了支付宝支付的流程,这里我们对上面的流程做个总结,要想接入支付宝支付,必须是企业用户才行,个人用户不支持,所以在开始写代码之前,要和公司的相关负责人申请好支付宝支付的相关配置参数,有了这些才能进行下面的工作,这里最重要的一点就是支付宝支付的回调了,回调,在生产环境必须配置可以外网访问的URL,同时域名必须是备案过的,二级域名也可以,这里我们为了方便测试,所以就使用了内网穿透工具natapp,该工具既有免费通道也有收费通道,收费通道也很便宜,如果只是测试,免费通道就够用了,另外还有一点要注意,就是支付宝支付的回调,默认支付宝是回调多次的,所以会有重复回调的问题,这里留给大家一个思考,怎么防止支付宝的多次回调,以免影响业务,希望有兴趣的小伙伴可以留言交流。以上就是支付宝支付(电脑网站支付)的全部内容了,有想要完全源代码的小伙伴,可以加群交流,QQ群号:715224124

八:如有问题可以加群讨论解决:

QQ群号:278298761

Java之支付宝支付(电脑网站支付)案例实战相关推荐

  1. php支付宝系列之电脑网站支付,一个PHP文件搞定支付宝之电脑网站支付

    本篇文章给大家分享的内容是关于用一个PHP文件搞定支付宝之电脑网站支付 ,有需要的朋友可以参考一下 网上的很多PHP支付宝支付接入教程都颇为复杂,且需要配置和引入较多的文件,本人通过整理后给出一个单文 ...

  2. SpringBoot整合支付宝之电脑网站支付

    SpringBoot整合支付宝之电脑网站支付 一.支付宝介绍 1.2 过程分析 1.3 对接支付宝的准备工作 1.4 申请步骤: 2.支付功能实现 2.1 思路分析 2.2 编写支付宝支付接口 2.2 ...

  3. 支付宝支付 - 电脑网站支付

    目录 1. 支付宝支付 - 配置 2. 支付宝支付 - 电脑网站支付 一.引用dll 二.发起支付 /// <summary> /// 支付 /// </summary> // ...

  4. PHP开发支付宝之电脑网站支付--流程简介

    前言 前端时间自己开发了一个drupal的支付宝模块,现在整理一下过程,因为支付宝官方网站提供的接口及文档都是新接口的,而且使用新接口的过程比较麻烦一点,所以整理一下 1.支付宝的账号必须经过企业资格 ...

  5. 支付宝系列-电脑网站支付

    1.概念 电脑网站支付,也称扫码支付,是专门针对PC端业务而开发的一种支付方式,既有支付宝提供在网页展示一个动态生成的支付二维码,用户通过手机支付宝扫码以后可实现支付功能的一种支付方式. 2.创建应用 ...

  6. 支付宝支付-电脑网站支付

    官方文档 支付接口(alipay.trade.page.pay): 商户系统请求支付宝接口alipay.trade.page.pay,支付宝对商户请求参数进行校验,而后重定向至用户登录页面. 用户确认 ...

  7. 支付宝支付-电脑网站支付开发

    公司产品需要做一个订单系统,需要在线下单支付功能,由于时间紧,任务重,选择了阿里的电脑网站支付作为支付的手段接入.一定要区分阿里的扫码支付和电脑网站支付的区别,刚开始我就搞混了.网站支付的页面类似于下 ...

  8. Java之支付宝支付(电脑网站支付)沙箱测试版

    支付宝支付流程及注意事项(沙箱测试版) 一:支付宝支付接入准备工作: 首先,支付宝支付和微信支付意愿,都是只支持企业用户,个人用户是不能接入支付宝支付的,所以要想接入支付宝支付,首先需要有支付宝的企业 ...

  9. 支付宝之电脑网站支付(保姆版)

      大家好,我是大史兄弟,一个不断摸索爬行的程序员.看CSND文章已经有好多年了,但是写文章还是第一次.我不是行业的大牛,只是一个希望不断进步成为大牛的小白程序员.   不知道有没有和我一样情况的,学 ...

  10. 接入支付宝电脑网站支付实现JAVA版

    简介 首先要说明的是个人感觉接入支付宝比微信简单多了,很轻松的,所以同学们不要紧张~ 当然还是老规矩啦,上来肯定的贴上官网地址,因为我这些服务天天在更新,而我的文章是教大家方法,而让你不是照葫芦画瓢 ...

最新文章

  1. qt on android 桌面鼠标事件,Qt on Android 不能自动创建Qt套件的问题的解决
  2. 11月下旬国内域名解析商Top10:中国数据5.03%居第四
  3. ((sizeof(n)+sizeof(int)-1)~(sizeof(int)-1))
  4. 利用mochiweb让服务端主动推送数据至前端页面
  5. Codeforces Beta Round #75 (Div. 1 Only) B. Queue 线段树。单点更新
  6. deepfake 图片_DeepFake克星来了!简单2步算法,造假图像无处可逃
  7. 你是程序员?你会修电脑么!!!
  8. 今晚7点见!红魔5G游戏手机联手热门手游打造专属主题
  9. Spark on YARN 两种模式yarn-cluster yarn-client 面试题
  10. Eclipse 常用快捷键和使用技巧
  11. android 使用android.support.v7 添加ActionBar
  12. 安装APK时弹窗提示“Detected problems with app native libraries”
  13. 使用html链接上传木马,一段植入木马的html代码
  14. 来自《星际迷航》的灵感启发
  15. 网页源文件星号怎么显示_【亲测实用】网页隐藏密码查看方法
  16. 今日睡眠质量记录70
  17. 魅族16php7.3系统,魅族16X 官方Flyme7.3.0.0A稳定版
  18. hdu3910 Liang Guo Sha(期望)
  19. 计算机二级vb常考知识点,全国计算机二级vb考试应考注意事项
  20. 分布式搜索引擎ElasticSearch

热门文章

  1. 电脑缓存,缓存设置(电脑缓存设置多少合理)
  2. 编程之美4.7蚂蚁爬杆扩展问题附猎人抓狐狸(必胜策略)
  3. 斐波那契常见规律(总结)
  4. starbound服务器配置文件怎么写,【mod向】简单修改文件迅速刷到任何想要物品以及修改随机生成物品入手时数据可以带入任何服务器【修改向】...
  5. 数据挖掘与数据分析项目链家租房数据(二)从性价比看链家推荐是否存在套路。
  6. MySQL数据库CPU使用率过高,怎么办
  7. 弃用 Notepad++,这款开源替代品更牛逼!
  8. Copycat CNN: Stealing Knowledge by Persuading Confession with Random Non-Labeled Data阅读心得
  9. Codeforces Round #614 (Div. 2)A. ConneR and the A.R.C. Markland-N
  10. 如何培养卓越的执行力