支付宝当面付(条码支付)功能开发

1、什么是当面付

当面付产品介绍

商户可通过以下任一方式在线下完成交易收款:

  • 商家通过扫描线下买家支付宝钱包中的条码、二维码等方式将买家的交易资金直接打入卖家支付宝账户,资金实时到账;
  • 线下买家通过使用支付宝钱包扫描商家的二维码等方式完成支付,提升商家收银效率,资金实时到账;
  • 线下买家使用支付宝钱包中的当面付功能,通过声波支付的方式向商家完成付款,资金实时到账。

简单地说,即我们日常中使用的 条码支付、扫码支付、声波支付。

本篇的开发流程,将以条码支付为功能开发展开说明,条码支付即用户展示付款条码,商家设定金额后采用扫码枪(或输入用户条码值)扫描用户条码,直接进行扣款,所有操作由商家完成,用户仅需提供条码。


2、条码支付业务说明

使用步骤很简单:

  • 用户登录支付宝钱包,在首页点击“付款”,进入付款码界面
  • 收银员在商家收银系统操作生成订单
  • 用户出示其“付款码”,收银员用扫码设备扫描用户手机上的条码(或手动输入条码值)后,商家收银系统提交支付
  • 付款后支付宝后台会返回支付结果给商家,同时将支付情况通知到用户


3、如何接入条码支付

官方接入文档说明:当面付快速接入

3.1 创建应用和配置

3.1.1 创建应用

登陆支付宝开放平台,找到 “ 开发者中心 - 应用 - 创建应用 ”:

创建应用后,选择支付应用,因为是自己开发自己用,所以选择自用型应用,名称自定义:

3.1.2 填写资料和提交审核



功能选项中需要签约开通“当面付”,提交一些审核资料什么的,此处不展开。

这部分的说明在官方有详细文档《开放平台应用创建指南》,此处仅对 “开发配置” 作重点说明:

3.1.2.1 应用网关 和 授权回调地址

  • 应用网关,用于接收支付宝异步通知(比如用户付款成功了的通知会发送到该地址,口碑开店的门店信息修改也会触发通知)
  • 授权回调地址,即第三方授权或用户信息授权后回调地址

这两项是非必需填写项,根据实际情况来是否配置。

3.1.2.2 应用密钥RSA2

密钥的生成在官方有文档说明《如何生成密钥》:

注意:其中密钥长度为1024的即为RSA(SHA1),长度为2048的即为RSA2(SHA256)

3.1.2.3 提交审核

各项设置完成后,提交审核,审核预计在一个工作日完成,审核完成后,应用状态会显示为“已上线”。

(注意:应用命名不能出现如支付字样,于是之前我的应用因为名字“猛追湾一卡通条码支付”被驳回审核了,手动微笑)

3.2 条码支付开发

先看下官方提供的接口调用流程:

显然,如上所示,涉及三个接口:

接口调用涉及一大堆参数,支付宝倒是也很贴心,直接帮我们做好了相关的SDK(服务端SDK),可以直接调用API,而且对于一些公共参与已经帮我们封装好了,调用时只需要传入业务参数即可。

下载好SDK之后,里面的readme也写的很明白,集成支付宝接口需要引入的文件是:

  • alipay-sdk-java*.jar
  • commons-logging-1.1.1.jar

在《服务端SDK》中有调用示例如下:

  1. //实例化客户端
  2. AlipayClient alipayClient = new DefaultAlipayClient("https://openapi.alipay.com/gateway.do", APP_ID, APP_PRIVATE_KEY, "json", CHARSET, ALIPAY_PUBLIC_KEY, "RSA2");
  3. //实例化具体API对应的request类,类名称和接口名称对应,当前调用接口名称:alipay.open.public.template.message.industry.modify
  4. AlipayOpenPublicTemplateMessageIndustryModifyRequest request = new AlipayOpenPublicTemplateMessageIndustryModifyRequest();
  5. //SDK已经封装掉了公共参数,这里只需要传入业务参数
  6. //此次只是参数展示,未进行字符串转义,实际情况下请转义
  7. request.setBizContent(" {" +
  8. " \"primary_industry_name\":\"IT科技/IT软件与服务\"," +
  9. " \"primary_industry_code\":\"10001/20102\"," +
  10. " \"secondary_industry_code\":\"10001/20102\"," +
  11. " \"secondary_industry_name\":\"IT科技/IT软件与服务\"" +
  12. " }");
  13. AlipayOpenPublicTemplateMessageIndustryModifyResponse response = alipayClient.execute(request);
  14. //调用成功,则处理业务逻辑
  15. if(response.isSuccess()){
  16. //.....
  17. }

显然因为SDK封装得很友好,我们只需要传入配置参数,设置好业务内容参数,直接调起方法就可以了。下面是我个人的代码示例:

为了方便将来配置参数的修改,配置直接写到了配置文件中:

  1. #应用id,要求应用上线,且其下功能签约状态为生效
  2. appId=20110906...78327
  3. #应用私钥(appId所属应用的应用私钥)RSA2加密方式
  4. privateKey=MIIEvgI...oC6/I2xPqZnvhbntS5qi1NwYg2
  5. #支付宝公钥
  6. alipayPublicKey=MIIBI...wIDAQAB

然后做一个类来进行封装开发者配置,用一个类来封装业务参数的JSON,再封装一个工具类以使用。

封装开发者配置的类:

  1. import java.io.IOException;
  2. import java.io.InputStream;
  3. import java.util.Properties;
  4. /**
  5. * 支付宝API类
  6. */
  7. public class AlipayAPI {
  8. /** 应用ID */
  9. private static String appId;
  10. /** 应用私钥 */
  11. private static String privateKey;
  12. /** 支付宝公钥 */
  13. private static String alipayPublicKey;
  14. /** 支付调用接口 */
  15. private static final String url_pay = "https://openapi.alipay.com/gateway.do";
  16. static {
  17. InputStream is = AlipayAPI.class.getResourceAsStream("/alipay.properties");
  18. Properties prop = new Properties();
  19. try {
  20. prop.load(is);
  21. setAppId(prop.getProperty("appId"));
  22. setPrivateKey(prop.getProperty("privateKey"));
  23. setAlipayPublicKey(prop.getProperty("alipayPublicKey"));
  24. } catch (IOException e) {
  25. e.printStackTrace();
  26. }
  27. }
  28. public static String getAppId() {
  29. return appId;
  30. }
  31. public static void setAppId(String appId) {
  32. AlipayAPI.appId = appId;
  33. }
  34. public static String getPrivateKey() {
  35. return privateKey;
  36. }
  37. public static void setPrivateKey(String privateKey) {
  38. AlipayAPI.privateKey = privateKey;
  39. }
  40. public static String getAlipayPublicKey() {
  41. return alipayPublicKey;
  42. }
  43. public static void setAlipayPublicKey(String alipayPublicKey) {
  44. AlipayAPI.alipayPublicKey = alipayPublicKey;
  45. }
  46. public static String getUrl_pay() {
  47. return url_pay;
  48. }
  49. }

封装业务请求参数的类(注意,此处示例仅有部分必要参数,更多参数详见官方文档的请求参数部分):

  1. /**
  2. * 统一收单交易支付的参数封装类
  3. */
  4. public class PayParam {
  5. /** 商户订单 */
  6. private String out_trade_no;
  7. /** 支付场景 */
  8. private String scene;
  9. /** 支付授权码,即用户的付款码 */
  10. private String auth_code;
  11. /** 订单标题 */
  12. private String subject;
  13. /** 订单金额 */
  14. private double total_amount;
  15. public PayParam(String out_trade_no, String subject, double total_amount, String auth_code) {
  16. this.out_trade_no = out_trade_no;
  17. this.subject = subject;
  18. this.total_amount = total_amount;
  19. this.auth_code = auth_code;
  20. }
  21. public String getOut_trade_no() {
  22. return out_trade_no;
  23. }
  24. public void setOut_trade_no(String out_trade_no) {
  25. this.out_trade_no = out_trade_no;
  26. }
  27. public String getScene() {
  28. return scene;
  29. }
  30. public void setScene(String scene) {
  31. this.scene = scene;
  32. }
  33. public String getAuth_code() {
  34. return auth_code;
  35. }
  36. public void setAuth_code(String auth_code) {
  37. this.auth_code = auth_code;
  38. }
  39. public String getSubject() {
  40. return subject;
  41. }
  42. public void setSubject(String subject) {
  43. this.subject = subject;
  44. }
  45. public double getTotal_amount() {
  46. return total_amount;
  47. }
  48. public void setTotal_amount(double total_amount) {
  49. this.total_amount = total_amount;
  50. }
  51. }

支付工具类和测试代码:

  1. import com.alibaba.fastjson.JSON;
  2. import com.alipay.api.AlipayApiException;
  3. import com.alipay.api.AlipayClient;
  4. import com.alipay.api.DefaultAlipayClient;
  5. import com.alipay.api.request.AlipayTradePayRequest;
  6. import com.alipay.api.response.AlipayTradePayResponse;
  7. import java.util.Date;
  8. /**
  9. * 支付宝的工具类
  10. */
  11. public class AlipayUtil {
  12. /** UTF8编码格式 */
  13. private static final String CHARSET_UTF8 = "UTF-8";
  14. /** 加密方式 */
  15. private static final String SIGN_TYPE = "RSA2";
  16. /** 数据格式 */
  17. private static final String FORMAT = "JSON";
  18. /** 支付场景,条码支付 */
  19. private static final String SCENE_BARCODE = "bar_code";
  20. /**
  21. * 当面付(条码支付)
  22. * @param content
  23. * @return
  24. */
  25. public static AlipayTradePayResponse barCodePay(PayParam content){
  26. AlipayClient client = new DefaultAlipayClient(AlipayAPI.getUrl_pay(), AlipayAPI.getAppId(),
  27. AlipayAPI.getPrivateKey(), FORMAT, CHARSET_UTF8, AlipayAPI.getAlipayPublicKey(), SIGN_TYPE);
  28. AlipayTradePayRequest request = new AlipayTradePayRequest();
  29. content.setScene(SCENE_BARCODE);
  30. String bizContent = JSON.toJSONString(content);
  31. request.setBizContent(bizContent);
  32. AlipayTradePayResponse response = null;
  33. try {
  34. response = client.execute(request);
  35. } catch (AlipayApiException e) {
  36. e.printStackTrace();
  37. }
  38. return response;
  39. }
  40. /**
  41. * 支付完成后的业务处理
  42. * @param response
  43. */
  44. public static void afterBarCodePay(AlipayTradePayResponse response) {
  45. if (response.isSuccess()) {
  46. //处理业务逻辑
  47. System.out.println("start handle business");
  48. }
  49. }
  50. /**
  51. * 获取商户订单
  52. * @return
  53. */
  54. public static String getTradeNo() {
  55. return "PAY" + new Date().getTime();
  56. }
  57. //测试
  58. public static void main(String[] args) {
  59. String tradeNo = getTradeNo();
  60. String subject = "测试用订单";
  61. double totalAmount = 0.01;
  62. String authCode = "274726044141298157";
  63. PayParam param = new PayParam(tradeNo, subject, totalAmount, authCode);
  64. AlipayTradePayResponse response = barCodePay(param);
  65. System.out.println(response.getBody());
  66. afterBarCodePay(response);
  67. }
  68. }

因为SDK封装的缘故,所以整体过程很简单了,对于支付成功后的响应,以及其他支付查询、支付退款等功能就不再展开了。

但是自己在过程中还是有两个点觉得有点坑,再次提一下:

  • 创建AlipayClient对象的传参中,公钥是支付宝公钥,而不是应用公钥
  • 服务端SDK的示例中请求调用的类是AlipayOpenPublicTemplateMessageIndustryModifyResponse,实际条码支付的请求类应该调用AlipayTradePayRequest

4、参考链接

附件列表

时间: 2024-10-12 20:21:37

支付宝当面付(条码支付)功能开发的相关文章

支付宝支付开发—当面付条码支付和扫码支付

关键字:支付宝 当面付 条码支付 扫码支付 二维码支付 订单查询 退款作者:方倍工作室 本文介绍支付宝中当面付下属的条码支付.扫码支付.订单查询.退款申请的集成开发过程. 本文分为以下五个部分: 条码支付和扫码支付介绍 申请应用 密钥生成及配置 API及SDK集成 条码支付.扫码支付.订单查询.退款申请 一.条码支付及二维码支付介绍 1. 条码支付 条码支付是支付宝给到线下传统行业的一种收款方式.商家使用扫码枪等条码识别设备扫描用户支付宝钱包上的条码/二维码,完成收款.用户仅需出示付款码,所有收

支付宝支付开发——当面付条码支付和扫码支付

关键字:支付宝 当面付 条码支付 扫码支付 二维码支付 订单查询 退款作者:方倍工作室原文: http://www.cnblogs.com/txw1958/p/alipay-f2fpay.html 本文介绍支付宝中当面付下属的条码支付.扫码支付.订单查询.退款申请的集成开发过程. 本文分为以下五个部分: 条码支付和扫码支付介绍 申请应用 密钥生成及配置 API及SDK集成 条码支付.扫码支付.订单查询.退款申请 注: 支付宝支付开发有一定的门槛,如果您愿意为知识付费来节省您宝贵的时间,请直接见底

利用PBFunc在Powerbuilder中支付宝当面付功能

在PB实现支付宝当面付的功能,需要先在支付宝进行商户签约,并设置相关的公钥信息(具体参考支付宝文档). 然后使用对应的私钥文件对参数进RSAWithSha1前面计算.具体代码如下: string ls_pubFileName,ls_priFileName n_pbfunc_cryp lnv_cryp ls_priFileName ="D:\pbfunclib_pri.pem"//私钥文件 string ls_str string ls_appId,ls_secret,ls_biz_co

[5] 微信公众号开发 - 微信支付功能开发(网页JSAPI调用)

1.微信支付的流程 如下三张手机截图,我们在微信网页端看到的支付,表面上看到的是 "点击支付按钮 - 弹出支付框 - 支付成功后出现提示页面",实际上的核心处理过程是: 点击支付按钮时,执行一个Ajax到后台 后台通过前台的部分信息(如商品名额,金额等),将其组装成符合微信要求格式的xml,然后调用微信的"统一下单接口" 调用成功后微信会返回一个组装好的xml,我们提取之中的消息(预支付id也在其中)以JSON形式返回给前台 前台将该JSON传参给微信内置JS的方法

支付宝当面付扫码支付接口开发

最近公司要做一个有关支付的相关项目,需要对接支付宝的支付接口,实现扫描二维码支付功能,为此研究了一下支付宝相关业务.主要依据就是支付宝的相关接口文档: https://docs.open.alipay.com/catalog,重点关注如下红色方框部分 先看一下支付宝扫描二维码支付的业务流程,直接摘出来如下: 扫码支付(接入指引) 扫码支付,指用户打开支付宝钱包中的"扫一扫"功能,扫描商家展示在某收银场景下的二维码并进行支付的模式.该模式适用于线下实体店支付.面对面支付等场景. 业务流程

支付宝当面付Demo测试

1.直接登录支付宝开放平台 https://docs.open.alipay.com/ 2.下载当面付的测试demo https://docs.open.alipay.com/194/105201/ 3.我这里用的是idea,打开这个demo 4.修改这个文件 5.更改内容 6.沙箱环境地址 https://docs.open.alipay.com/200/105311 7.RSA生成工具地址 https://docs.open.alipay.com/291/105971 8.注意事项 原文地址

支付宝当面付开发(java)

业务流程: 接入准备: 直接下载demo: https://doc.open.alipay.com/doc2/detail.htm?spm=a219a.7629140.0.0.ArGFWi&treeId=193&articleId=105201&docType=1 下载完成后,分别将两个项目导入到IDE中: 打开zfb.properties,修改pid.appid.private_key.public_key,其他可不用修改. 打开url:https://openhome.alip

支付宝沙箱环境测试支付功能

1.下载电脑网站的官方demo: 进入蚂蚁金服开放平台,选择文档中心-->开发文档.传送门 选择手机网站支付 我这里选择的是java版本的demo 2.下载好之后进行解压,然后倒入到eclipse中,demo是eclipse工程项目. 注意:readme.txt请好好看一下 Demo只有一个Java配置类,其余都是JSP.咱们看一下配置类 上天红色框中的值就是要改成我们的,这些值需要在开发者中心进行创建应用设置的,下面开始配置 3.配置AlipayConfig (1) 注册蚂蚁金服开发者账号 注

记微信公众平台开发之V3版微信native原生支付功能开发

一.生成商品信息 动态链接支付过程中,是先生成商品交易进行,再来进行支付交易的. 1. 商品信息准备 主要是先定义商品的名称及价格,以及交易号.代码如下. include_once("../WxPayPubHelper/WxPayPubHelper.php"); //使用统一支付接口 $unifiedOrder = new UnifiedOrder_pub(); //设置统一支付接口参数 //设置必填参数 //appid已填,商户无需重复填写 //mch_id已填,商户无需重复填写 /