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

前端之家收集整理的这篇文章主要介绍了支付宝支付开发——当面付条码支付和扫码支付实例前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。

本文介绍支付宝中当面付下属的条码支付、扫码支付、订单查询、退款申请的集成开发过程。

本文分为以下五个部分:

  • 条码支付和扫码支付介绍
  • 申请应用
  • 密钥生成及配置
  • API及SDK集成
  • 条码支付、扫码支付、订单查询、退款申请

一、条码支付及二维码支付介绍

1. 条码支付

条码支付是支付宝给到线下传统行业的一种收款方式。商家使用扫码枪等条码识别设备扫描用户支付宝钱包上的条码/二维码,完成收款。用户仅需出示付款码,所有收款操作由商家端完成。其使用场景如下:

业务流程:

使用步骤:

  1. 用户登陆支付宝钱包,点击首页“付款”,进入付款码界面;
  2. 收银员在商家收银系统操作生成订单,用户确认支付金额;
  3. 用户出示钱包的“付款码”,收银员用扫码设备来扫描用户手机上的条码/二维码后,商家收银系统提交支付;
  4. 付款成功后商家收银系统会拿到支付成功或者失败的结果。
  5. @H_502_43@

    2. 扫码支付

    扫码支付,指用户打开支付宝钱包中的“扫一扫”功能,扫描商家展示在某收银场景下的二维码并进行支付的模式。该模式适用于线下实体店支付、面对面支付等场景。

    其使用场景如下:

    业务流程:

    使用步骤:

    1. 用户登陆支付宝钱包,点击首页“付款-扫码付”,进入扫一扫界面;
    2. 收银员在商家收银系统操作生成支付宝订单,用户确认支付金额,并生成二维码
    3. 用户使用钱包的“扫码付”,扫收银员提供的二维码,确认支付;
    4. 用户付款后商家收银系统会拿到支付成功或者失败的结果。
    5. @H_502_43@

      二、接口申请

      企业在申请企业支付宝之后,进行功能申请并签约,然后在蚂蚁金服开放平台中申请应用如下(详细过程就略了)

      然后在功能列表中,申请当面付这一功能,申请成功后如下。

      这样,我们就有了当面付的权限了。

      三、密钥生成

      在支付宝当面付的接口中,使用了非对称加密算法,商户自己的公钥和私钥需要自己使用OpenSSL手动生成。对这些概念比较陌生的话,请先自行先了解一下密码学的相关知识。OpenSSL也可以从方倍工作室博客中找到。

      下载支付宝官方提供的密钥生成工具OpenSSL,然后执行以下命令就可以生成公钥和私钥。

      其中

      是用于生成RSA私钥,执行后在程序目录中生成一个文件rsa_private_key.pem,其内容如下

      -----BEGIN RSA PRIVATE KEY----- MIICXAIBAAKBgQCyffRONGd8Q/1kRh1cpsSRi360DXLHI7zxdPJGYe5HKDWF7u9b 3zZU9erZpM90XE7gZRKsxIgOurH4uqhmVRbto3e+LiYOyNpd6As3Q427KCTIT7aj hHicZ6GWhegTUiVLqiuWLsauQcbI6DO4GEZrlvAdzus0WcJiJOxW02rxSQIDAQAB AoGAXBJYyVaC4zj3Jph8YOStlR5N13bwdATdW/glWWT+0rnNEi90TQHRNvY7lNVN JgrPrTS182TVgjOPxmwSnebakhIuGIdPq99GLE4LGd5lKWTzkd84BMvhatfNsCCz cEVFqKg3tZd4t3fQ93FrILsnnZpLhiW53jIrStCkR3rx9OECQQDWMSHyc91hEVMQ qVNasbGEicKWxhoDqjdm2lHkBx4mrB9JEZFDs6MxWdajf2/Qw+tgtpN3YBcCDw/H nGHhQtStAkEA1VTyjOdAwWode8X4fu0IPq9+E19mcVOAJjLBH46mropwgOdj3raq T/ThaKeaydjabsTAiY2J18HiTiyH+1bGjQJBAKgRJXH5OFxSG7uXIbCofYJiFi34 g7EcfxxVcqxaaW4u4N2Uy0c0TXkL5T+lXzeQg8D/gfbJj0QuTVNzgdofdoECQBHY OznCFk6Xe8PguXqUhT4JG/iu4DjWjT+kuzbSjerHtcVylY4JpZFuoHRKoM4Fj6/4 UUqwRjmABFgZrX4+sfkCQCNI8RCZ6yprh5kEOePo3uazAlNENP8dKkhgqChawdK7 7NzlJ727Nt23STHFx6NkhzyruJGQ5Vx1Lkl0wKuKbXM= -----END RSA PRIVATE KEY-----

      命令

      是用于生成RSA公钥,执行后在程序目录中生成一个文件rsa_public_key.pem,其内容如下

      -----BEGIN PUBLIC KEY----- MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQCyffRONGd8Q/1kRh1cpsSRi360 DXLHI7zxdPJGYe5HKDWF7u9b3zZU9erZpM90XE7gZRKsxIgOurH4uqhmVRbto3e+ LiYOyNpd6As3Q427KCTIT7ajhHicZ6GWhegTUiVLqiuWLsauQcbI6DO4GEZrlvAd zus0WcJiJOxW02rxSQIDAQAB -----END PUBLIC KEY-----

      生成的这个RSA公钥,需要填写到应用中去,填写地址如下所示。私钥不需要填到配置中,到时候配置到代码中。

      特别注意,密钥要去掉注释部分,且转换成一行字符,否则回车换行也成为密钥的一部分,将导致无法正常加解密。

      同时,可以点击 “查看支付宝公钥”,将支付宝的公钥复制保存下来,后面的程序中将需要用到。

      四、密钥生成API与密钥配置

      公共参数

      请求地址:

      公共请求参数:

      名称支持JSON生成签名字符串所使用的签名算法类型,目前支持RSA快速接入文档
      用户ID标题关闭交易。

      系统中配置如下

      "MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDDI6d306Q8fIfCOaTXyiUeJHkrIvYISRcc73s3vF1ZT7XN8RNPwJxo8pWaJMmvyTn9N4HQ632qJBVHf8sxHi/fEsraprwCtzvzQETrNRwVxLO5jVmRGi60j8Ue1efIlzPXV9je9mkjzOmdssymZkh2QhUrCmZYI/FCEa3/cNMW0QIDAQAB",//商户私钥 'merchant_private_key' => "MIICXAIBAAKBgQCyffRONGd8Q/1kRh1cpsSRi360DXLHI7zxdPJGYe5HKDWF7u9b3zZU9erZpM90XE7gZRKsxIgOurH4uqhmVRbto3e+LiYOyNpd6As3Q427KCTIT7ajhHicZ6GWhegTUiVLqiuWLsauQcbI6DO4GEZrlvAdzus0WcJiJOxW02rxSQIDAQABAoGAXBJYyVaC4zj3Jph8YOStlR5N13bwdATdW/glWWT+0rnNEi90TQHRNvY7lNVNJgrPrTS182TVgjOPxmwSnebakhIuGIdPq99GLE4LGd5lKWTzkd84BMvhatfNsCCzcEVFqKg3tZd4t3fQ93FrILsnnZpLhiW53jIrStCkR3rx9OECQQDWMSHyc91hEVMQqVNasbGEicKWxhoDqjdm2lHkBx4mrB9JEZFDs6MxWdajf2/Qw+tgtpN3YBcCDw/HnGHhQtStAkEA1VTyjOdAwWode8X4fu0IPq9+E19mcVOAJjLBH46mropwgOdj3raqT/ThaKeaydjabsTAiY2J18HiTiyH+1bGjQJBAKgRJXH5OFxSG7uXIbCofYJiFi34g7EcfxxVcqxaaW4u4N2Uy0c0TXkL5T+lXzeQg8D/gfbJj0QuTVNzgdofdoECQBHYOznCFk6Xe8PguXqUhT4JG/iu4DjWjT+kuzbSjerHtcVylY4JpZFuoHRKoM4Fj6/4UUqwRjmABFgZrX4+sfkCQCNI8RCZ6yprh5kEOePo3uazAlNENP8dKkhgqChawdK77NzlJ727Nt23STHFx6NkhzyruJGQ5Vx1Lkl0wKuKbXM=",//编码格式 'charset' => "UTF-8",//支付宝网关 'gatewayUrl' => "https://openapi.alipay.com/gateway.do",//应用ID 'app_id' => "2016061501500000",//异步通知地址,只有扫码支付预下单可用 'notify_url' => "http://www.fangbei.org/alipay/notify.html",//最大查询重试次数 'MaxQueryRetry' => "10",//查询间隔 'QueryDuration' => "3" );

      其中支付宝公钥就是在前面中复制保存的,直接复制到程序中即可,而商户私钥是之前OpenSSL中生成的私钥。APPID是该服务的id号。

      而这个异步通知将会接收扫码支付结果的通知。

      五、条码支付、扫码支付、订单查询、退款申请

      1. 条码支付

      条码支付的参数配置如下

      // (必填) 付款条码,用户支付宝钱包手机app点击“付款”产生的付款条码
      $authCode = $_POST['auth_code']; //28开头18位数字

      // 支付超时,线下扫码交易定义为5分钟
      $timeExpress = "5m";

      // 创建请求builder,设置请求参数
      $barPayRequestBuilder = new AlipayTradePayContentBuilder();
      $barPayRequestBuilder->setOutTradeNo($outTradeNo);
      $barPayRequestBuilder->setTotalAmount($totalAmount);
      $barPayRequestBuilder->setAuthCode($authCode);
      $barPayRequestBuilder->setTimeExpress($timeExpress);
      $barPayRequestBuilder->setSubject($subject);
      // 调用barPay方法获取当面付应答
      $barPay = new AlipayTradeService($config);
      $barPayResult = $barPay->barPay($barPayRequestBuilder);

      switch ($barPayResult->getTradeStatus()) {
      case "SUCCESS":
      echo "支付宝支付成功:" . "
      --------------------------
      ";
      print_r($barPayResult->getResponse());
      break;
      case "FAILED":
      echo "支付宝支付失败!!!" . "
      --------------------------
      ";
      if (!empty($barPayResult->getResponse())) {
      print_r($barPayResult->getResponse());
      }
      break;
      case "UNKNOWN":
      echo "系统异常,订单状态未知!!!" . "
      --------------------------
      ";
      if (!empty($barPayResult->getResponse())) {
      print_r($barPayResult->getResponse());
      }
      break;
      default:
      echo "不支持的交易状态,交易返回异常!!!";
      break;
      }
      return;
      }

      程序监测,最终提交的url如下

      发送的json数据如下:

      接收到的数据如下

      logon_id":"118***@qq.com","buyer_pay_amount":"0.01","buyer_user_id":"2088002364008751","fund_bill_list":[ { "amount":"0.01","fund_channel":"ALIPAYACCOUNT" } ],"gmt_payment":"2016-08-26 17:14:59","invoice_amount":"0.01","open_id":"20880044751374809757987911112575","point_amount":"0.00","receipt_amount":"0.01","total_amount":"0.01","trade_no":"2016082621001004750244100034" },"sign":"pEDeMwh6x73t9LmWrZpGnVb1npnKtODw6+8MDUTurNPVWXR1JHT+x3cRt2G4SDNHzxkJTzSpUXjNylsWisRTnQJJzqRP5XMujxmaAHP/d5xXeyWasDag5Cj7yGD7t80buDAsdE4eoqQ6ox7KzJ6LwKcphOX13tI+Ukt1dGCQS5o=" }

      2. 扫码支付

      扫码支付的参数配置如下

      // 支付超时,线下扫码交易定义为5分钟
      $timeExpress = "5m";

      // 创建请求builder,设置请求参数
      $qrPayRequestBuilder = new AlipayTradePrecreateContentBuilder();
      $qrPayRequestBuilder->setOutTradeNo($outTradeNo);
      $qrPayRequestBuilder->setTotalAmount($totalAmount);
      $qrPayRequestBuilder->setTimeExpress($timeExpress);
      $qrPayRequestBuilder->setSubject($subject);

      // 调用qrPay方法获取当面付应答
      $qrPay = new AlipayTradeService($config);
      $qrPayResult = $qrPay->qrPay($qrPayRequestBuilder);

      // 根据状态值进行业务处理
      switch ($qrPayResult->getTradeStatus()){
      case "SUCCESS":
      echo "支付宝创建订单二维码成功:"."
      ---------------------------------------
      ";
      $response = $qrPayResult->getResponse();
      $qrcode = $qrPay->create_erweima($response->qr_code);
      echo $qrcode;
      print_r($response);

      break;
      case "Failed":
      echo "支付宝创建订单二维码失败!!!"."
      --------------------------
      ";
      if(!empty($qrPayResult->getResponse())){
      print_r($qrPayResult->getResponse());
      }
      break;
      case "UNKNOWN":
      echo "系统异常,状态未知!!!"."
      --------------------------
      ";
      if(!empty($qrPayResult->getResponse())){
      print_r($qrPayResult->getResponse());
      }
      break;
      default:
      echo "不支持的返回状态,创建订单二维码返回异常!!!";
      break;
      }

      生成的提交请求URL如下

      发送的json数据如下:

      返回的数据如下:

      就是二维码链接地址,使用接口将其成二维码后。 当支付宝用户扫码的时候,接口通知将收到如下数据

      50241229810","buyer_id":"2088002364008751","app_id":"2016061501500000","gmt_create":"2016-08-26 18:20:37","out_trade_no":"qrpay20160826062009757","seller_id":"2088421202724253","notify_time":"2016-08-26 18:20:37","subject":"方倍工作室-支付宝-当面付-扫码支付","trade_status":"WAIT_BUYER_PAY","sign_type":"RSA","buyer_logon_id":"118***@qq.com" }

      用户输入密码付款成功之后,将收到如下数据

      3. 订单查询

      订单查询的参数配置如下

      //第三方应用授权令牌,商户授权系统商开发模式下使用
      $appAuthToken = "";//根据真实值填写

      //构造查询业务请求参数对象
      $queryContentBuilder = new AlipayTradeQueryContentBuilder();
      $queryContentBuilder->setOutTradeNo($out_trade_no);

      $queryContentBuilder->setAppAuthToken($appAuthToken);

      //初始化类对象,调用queryTradeResult方法获取查询应答
      $queryResponse = new AlipayTradeService($config);
      $queryResult = $queryResponse->queryTradeResult($queryContentBuilder);

      //根据查询返回结果状态进行业务处理
      switch ($queryResult->getTradeStatus()){
      case "SUCCESS":
      echo "支付宝查询交易成功:"."
      --------------------------
      ";
      print_r($queryResult->getResponse());
      break;
      case "Failed":
      echo "支付宝查询交易失败或者交易已关闭!!!"."
      --------------------------
      ";
      if(!empty($queryResult->getResponse())){
      print_r($queryResult->getResponse());
      }
      break;
      case "UNKNOWN":
      echo "系统异常,订单状态未知!!!"."
      --------------------------
      ";
      if(!empty($queryResult->getResponse())){
      print_r($queryResult->getResponse());
      }
      break;
      default:
      echo "不支持查询状态,交易返回异常!!!";
      break;
      }

      最终提交的url如下

      发送的json数据如下:

      接收到的数据如下

      //第三方应用授权令牌,商户授权系统商开发模式下使用
      $appAuthToken = "";//根据真实值填写

      //创建退款请求builder,设置参数
      $refundRequestBuilder = new AlipayTradeRefundContentBuilder();
      $refundRequestBuilder->setOutTradeNo($out_trade_no);
      $refundRequestBuilder->setRefundAmount($refund_amount);
      $refundRequestBuilder->setOutRequestNo($out_request_no);

      $refundRequestBuilder->setAppAuthToken($appAuthToken);

      //初始化类对象,调用refund获取退款应答
      $refundResponse = new AlipayTradeService($config);
      $refundResult = $refundResponse->refund($refundRequestBuilder);

      //根据交易状态进行处理
      switch ($refundResult->getTradeStatus()){
      case "SUCCESS":
      echo "支付宝退款成功:"."
      --------------------------
      ";
      print_r($refundResult->getResponse());
      break;
      case "FAILED":
      echo "支付宝退款失败!!!"."
      --------------------------
      ";
      if(!empty($refundResult->getResponse())){
      print_r($refundResult->getResponse());
      }
      break;
      case "UNKNOWN":
      echo "系统异常,订单状态未知!!!"."
      --------------------------
      ";
      if(!empty($refundResult->getResponse())){
      print_r($refundResult->getResponse());
      }
      break;
      default:
      echo "不支持的交易状态,交易返回异常!!!";
      break;
      }

      最终提交的url如下

      发送的json数据如下:

      接收到的数据如下

      logon_id":"123***@qq.com","fund_change":"Y","gmt_refund_pay":"2016-08-26 18:47:41","refund_detail_item_list":[ { "amount":"0.01","refund_fee":"0.01","send_back_fee":"0.01","trade_no":"2016082621001004750239053830" },"sign":"YDNSMpX5y0rQEs0ZbfNxRFVIp8hf0W30OR74cMtwKVPO2BYee6TQC+pbnwESSZ2XSGLozTyy7o+SIa07L+FMhDv/PTt6QX1mVgQv7RhzoDkls0zDRS/5/fy9Oyj01XS1wb8Od/93iNLZDkd2yw9g0He6qGYlpcXutkmwuASd7BM=" }

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

      猜你在找的PHP相关文章