php实现支付宝当面付(扫码支付)功能

网上的很多PHP支付宝支付接入教程都颇为复杂,且需要配置和引入较多的文件,本人通过整理后给出一个单文件版的,希望可以给各位想接入支付宝支付的带来些许帮助和借鉴意义。

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

运行以下php文件代码即可生成一张付款二维码图片,使用支付宝扫一扫即可付款。

一个PHP文件搞定支付宝系列

一个PHP文件搞定微信支付系列

环境依赖

PHP5.0以上,且需要开启CURL服务、SSL服务。

注意事项

1.文件开头的配置信息必须完善
2.商户私钥需填写对应签名算法类型的私钥,如何生成密钥参考:
2.1 生成RSA密钥 
2.2 创建应用

代码

<?php
header('Content-type:text/html; Charset=utf-8');
$appid = 'xxxxx'; //https://open.alipay.com 账户中心->密钥管理->开放平台密钥,填写添加了电脑网站支付的应用的APPID
$notifyUrl = 'http://www.xxx.com/alipay/notify.php';   //付款成功后的异步回调地址
$outTradeNo = uniqid();   //你自己的商品订单号
$payAmount = 0.01;     //付款金额,单位:元
$orderName = '支付测试';  //订单标题
$signType = 'RSA2';    //签名算法类型,支持RSA2和RSA,推荐使用RSA2
//商户私钥,填写对应签名算法类型的私钥,如何生成密钥参考:https://docs.open.alipay.com/291/105971和https://docs.open.alipay.com/200/105310
$saPrivateKey='MIIEpAIBAAKCAQEA1MV+OY6MvGfXPM0MkpjT+FdzGmPOvVmX2wF3gjwQpeHBEUP9jLXhVS32fZ1iXI1e7WUGQ5tvXn28P8190kpOn/c/G5t2CAksUvemvF7uJN/N3Z1HFMdt3omvCd14K05lgcFYz7Z4c+A7ZJF5bPCB6oshjjUmbCY3hibuWzX/1j8AgsoD9lLy1oFqxLj98k5ZrYIhk900gMQs/WJ3A1FC09Dln9fuhBUyjtPHaml+4w+sdkdzxPktxdFrMcI7M7rNEwg25XtST5Z49oFpE84AlXM7+oC9jYvIpTGE00WomsgtakN039ucT/59Bup6pLkO08Rv85UXbqzGTcYAhNHLfQIDAQABAoIBAQCbuPM58s+j8KgB8ty5yiqRPoeaj+O2h4Txn7A02/sfPQvNtCI0w3TpT5twsihULo+EVYTxJCitUn7df2sP5pyGzTEd5njLRtNu4Zvhj+Thjf8grERiu9b4oXI/WRzjLRxzi+uREi40OK+fWi0xgxDCdROY/eNiEdJfV8zpaqsUxG7VdwZIJQ/8d3Mi31OWv30kr9jfEd15DBInGJgSqR+qwrAB4pBSMcW8hL6PYlzoPi1ygceFjRrnbeMG40zt0OUPSexQIgAmFvGqxTl5xo3dFEziGHdfWYsBKZ2M8ubAe+R6LcndxI+o2Hw4TNcC1tDeNMtjw7+h9S5aef5A8uWBAoGBAPxCLWPhUHCYlIXUz0D1SoolZs9WK7Kz1YSWnzqrpegN+foS5/ji93YylGE+KL31TwbnGQLAwknwMX3qTzmkvTovmy8jevXBsCSEFm81q0wG/35e1SKkTXL66RqB2y0xFLdcF3f9s8ZiEclqkYwNSHh0nqzREfIxMMAsj+3n2vHdAoGBANftYkZYrbs4iI/ZcjmBYguYikNfNmrD+Ta6ckOGZqsHfwXJCAz1rF4/XCqVAc9nxuzJR/72qkn9z07uH6qSZCqlZDRkiiKaK2UVqFDB+0abMk/TGHXuMmdvMkyj2jEZxG2rkg0kmg4qYkkg/5tGG1On/2GeZNVPu8JpsFr1pDYhAoGBANr8pCTKC6fDfWP1C3qrtmrY7zhc6RB4d4pjq5UmP5+EypaiZQi2F/dfD1qfuIS3eURXyGmQZtoDDyPtDZvP/ImPnFs+pNbFryD0HfmrEKquhIvyzXoGQknnsgbV5iyEKCTJaII9FxzINAKzZei7+0a+jqUd1kN3Gogp50Sze2ltAoGARaM5Xpaa8RZ6dGocfI9Nn4/Ch5fdZPFvHkdjMoPV+LKiNKtw/Tz+KiclAlasDsfZT+RaY9AJe3NvuHTzoX807swIVR1Xr3EpLaCed+0XrN3AjB34dZAskU87WZw+cjdtMjFzGOoFBSyGJi+OP/WMOp6jo/YBbwoX88tCJROzsgECgYAT8pHHIyPt5Y/5pDb8EDvD3XNES1fBkfZffSoAodsrkeoKgrsKl+9M3rcGX+S9dscyoH0ur3BFTMHtIOOhC5qytt+BhMHIP5mAs4di4u/joQCWQbUyrUggVK5it+6BFgAT+jeB7zTAUtgGpTVFq3kLbV0NZ+XQyEHVlnoJnHYpQg==';
$aliPay = new AlipayService($appid,$returnUrl,$notifyUrl,$saPrivateKey);
$result = $aliPay->doPay($payAmount,$outTradeNo,$orderName,$returnUrl,$notifyUrl);
$result = $result['alipay_trade_precreate_response'];
if($result['code'] && $result['code']=='10000'){
  //生成二维码
  $url = 'http://pan.baidu.com/share/qrcode?w=300&h=300&url='.$result['qr_code'];
  echo "<img src='{$url}' style='width:300px;'><br>";
  echo '二维码内容:'.$result['qr_code'];
}else{
  echo $result['msg'].' : '.$result['sub_msg'];
}
class AlipayService
{
  protected $appId;
  protected $returnUrl;
  protected $notifyUrl;
  //私钥文件路径
  protected $rsaPrivateKeyFilePath;
  //私钥值
  protected $rsaPrivateKey;
  public function __construct($appid, $returnUrl, $notifyUrl,$saPrivateKey)
  {
    $this->appId = $appid;
    $this->returnUrl = $returnUrl;
    $this->notifyUrl = $notifyUrl;
    $this->charset = 'utf8';
    $this->rsaPrivateKey=$saPrivateKey;
  }
  /**
   * 发起订单
   * @param float $totalFee 收款总费用 单位元
   * @param string $outTradeNo 唯一的订单号
   * @param string $orderName 订单名称
   * @param string $notifyUrl 支付结果通知url 不要有问号
   * @param string $timestamp 订单发起时间
   * @return array
   */
  public function doPay($totalFee, $outTradeNo, $orderName, $returnUrl,$notifyUrl)
  {
    //请求参数
    $requestConfigs = array(
      'out_trade_no'=>$outTradeNo,
      'total_amount'=>$totalFee, //单位 元
      'subject'=>$orderName, //订单标题
    );
    $commonConfigs = array(
      //公共参数
      'app_id' => $this->appId,
      'method' => 'alipay.trade.precreate',       //接口名称
      'format' => 'JSON',
      'charset'=>$this->charset,
      'sign_type'=>'RSA2',
      'timestamp'=>date('Y-m-d H:i:s'),
      'version'=>'1.0',
      'notify_url' => $notifyUrl,
      'biz_content'=>json_encode($requestConfigs),
    );
    $commonConfigs["sign"] = $this->generateSign($commonConfigs, $commonConfigs['sign_type']);
    $result = $this->curlPost('https://openapi.alipay.com/gateway.do',$commonConfigs);
    return json_decode($result,true);
  }
  public function generateSign($params, $signType = "RSA") {
    return $this->sign($this->getSignContent($params), $signType);
  }
  protected function sign($data, $signType = "RSA") {
    $priKey=$this->rsaPrivateKey;
    $res = "-----BEGIN RSA PRIVATE KEY-----\n" .
      wordwrap($priKey, 64, "\n", true) .
      "\n-----END RSA PRIVATE KEY-----";
    ($res) or die('您使用的私钥格式错误,请检查RSA私钥配置');
    if ("RSA2" == $signType) {
      openssl_sign($data, $sign, $res, version_compare(PHP_VERSION,'5.4.0', '<') ? SHA256 : OPENSSL_ALGO_SHA256); //OPENSSL_ALGO_SHA256是php5.4.8以上版本才支持
    } else {
      openssl_sign($data, $sign, $res);
    }
    $sign = base64_encode($sign);
    return $sign;
  }
  /**
   * 校验$value是否非空
   * if not set ,return true;
   *  if is null , return true;
   **/
  protected function checkEmpty($value) {
    if (!isset($value))
      return true;
    if ($value === null)
      return true;
    if (trim($value) === "")
      return true;
    return false;
  }
  public function getSignContent($params) {
    ksort($params);
    $stringToBeSigned = "";
    $i = 0;
    foreach ($params as $k => $v) {
      if (false === $this->checkEmpty($v) && "@" != substr($v, 0, 1)) {
        // 转换成目标字符集
        $v = $this->characet($v, $this->charset);
        if ($i == 0) {
          $stringToBeSigned .= "$k" . "=" . "$v";
        } else {
          $stringToBeSigned .= "&" . "$k" . "=" . "$v";
        }
        $i++;
      }
    }
    unset ($k, $v);
    return $stringToBeSigned;
  }
  /**
   * 转换字符集编码
   * @param $data
   * @param $targetCharset
   * @return string
   */
  function characet($data, $targetCharset) {
    if (!empty($data)) {
      $fileType = $this->charset;
      if (strcasecmp($fileType, $targetCharset) != 0) {
        $data = mb_convert_encoding($data, $targetCharset, $fileType);
        //$data = iconv($fileType, $targetCharset.'//IGNORE', $data);
      }
    }
    return $data;
  }
  public function curlPost($url = '', $postData = '', $options = array())
  {
    if (is_array($postData)) {
      $postData = http_build_query($postData);
    }
    $ch = curl_init();
    curl_setopt($ch, CURLOPT_URL, $url);
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
    curl_setopt($ch, CURLOPT_POST, 1);
    curl_setopt($ch, CURLOPT_POSTFIELDS, $postData);
    curl_setopt($ch, CURLOPT_TIMEOUT, 30); //设置cURL允许执行的最长秒数
    if (!empty($options)) {
      curl_setopt_array($ch, $options);
    }
    //https请求 不验证证书和host
    curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
    curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, false);
    $data = curl_exec($ch);
    curl_close($ch);
    return $data;
  }
}

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

(0)

相关推荐

  • PHP支付宝当面付2.0代码

    本文实例为大家分享了PHP支付宝当面付2.0代码,供大家参考,具体内容如下 //支付宝条码支付,直接调用ali_tiaoma_pay方法,把条码和金额传进去就ok function ali_tiaoma_pay($tiaoma,$price){ $data['scene'] = 'bar_code'; //支付场景 $data['out_trade_no'] = date("Ymd").rand(10000,99999); //订单号 $data['total_amount'] = $

  • 基于C#实现微信支付宝扫码支付功能

    为公司系统业务需要,这几天了解了一下微信和支付宝扫码支付的接口,并用c#实现了微信和支付宝扫码支付的功能. 微信支付分为6种支付模式:1.付款码支付,2.native支付,3.jsapi支付,4.app支付,5.h5支付,6.小程序支付 我在这里用到的是native支付,就是网页生成二维码让用户扫码支付,再调用回调接口判断用户是否支付成功. 支付宝支付api也挺多的,我只使用了一些我在系统中能够用到的,现在将代码简单记录在这里,先从微信支付开始. 微信支付 先上后台代码: 传入参数(总金额一定要

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

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

  • nodejs微信扫码支付功能实现

    前言 本篇文章主要是记录本人在微信扫码支付过程中所遇到的问题,给大家一个借鉴作用,希望对你们有帮助 开发环境 nodejs v8.1.0 egg v1.1.0 准备工作 微信公众号-appid 微信商户号-mch_id key值(签名算法所需,其实就是一个32位的密码,可以用md5生成一个)(key设置路径:微信商户平台(pay.weixin.qq.com)-->账户设置-->API安全-->密钥设置) 扫码支付-统一下单 以下才用的是微信模式二,因为比较简单 let MD5 = req

  • java实现微信扫码支付功能

    本文实例为大家分享了java实现微信扫码支付的具体代码,供大家参考,具体内容如下 1.maven项目的pom.xml中添加如下jar包: <dependency> <groupId>com.github.wxpay</groupId> <artifactId>wxpay-sdk</artifactId> <version>0.0.3</version> </dependency> 2.编写WeWxConfig类

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

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

  • Spring使用支付宝扫码支付

    前一段一直在研究支付宝的扫码支付,不得不说,支付宝的文档写的真是一个烂(起码在下刚开始看的时候是mengbi的).文档上面的示例和demo里面的示例长的完全不一样.往往文档上面的例子很简单,而demo的代码写的很复杂,所以一开始就不知道该采用哪个代码,后来仔细看了一下demo的那些包里面的代码,发现也是调用的文档示例的那些接口,这才明白它们原来是一个东西,只不过demo对文档的接口进行了一些包装而已. 首先申请一个企业的支付宝账号,这个账号有个pid,需要向这个账号里面添加应用,每个应用都有一个

  • .NET微信扫码支付接入(模式二-NATIVE)

    一.前言 经过两三天的琢磨总算完成了微信扫码支付功能,不得不感叹几句: 微信提供的DEMO不错,直接复制粘贴就可以跑起来了: 微信的配置平台我真是服了.公众平台.商户平台.开放平台,一个平台一套账户密码,大写的恶心        DEMO地址:https://pay.weixin.qq.com/wiki/doc/api/native.php?chapter=11_1 .NET版DEMO中的Lib文件夹是关键,直接复制到自己的代码里,或者打成dll随个人意愿. 二.正文 Step1:肯定是产生商户

  • C# MVC 微信支付教程系列之扫码支付代码实例

    今天,我们来一起探讨一下这个微信扫码支付.何为扫码支付呢?这里面,扫的码就是二维码了,就是我们经常扫一扫的那种二维码图片,例如,我们自己添加好友的时候,可以通过输入对方的微信号,也可以扫一扫对方的二维码.扫码支付,作为,微信支付里面,不可或缺的一个功能,对商品的支付提供了极为方便的体验,用途也非常的多. 例如我们在地铁.公交站常见的那些自动售货机(不错,就是那种投硬币,就可以自动出货的那种机器)中都用到.微信(支付宝)的扫码支付的出现,大大的减少了这方面的风险,近些年来,二维码的应用越来越广,甚

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

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

  • python实现支付宝当面付(扫码支付)功能

    本文实例为大家分享了python实现支付宝当面付示的具体代码,供大家参考,具体内容如下 一.配置信息准备 登录蚂蚁金服开放平台:https://open.alipay.com/platform/home.htm 开发资料阅读:https://docs.open.alipay.com/194/106078 创建好应用,配置好密钥等信息后,就可以开发了. 二.开发支付宝支付工具类 1:相关配置信息 # ========支付相关配置信息=========== ALIPAY_INPUT_CHARSET

随机推荐