検索
ホームページバックエンド開発PHPチュートリアルPHPを使用したPCでのAlipayスキャンコード支払いの紹介

这篇文章主要介绍了关于PHP PC端支付宝扫码支付的介绍,有着一定的参考价值,现在分享给大家,有需要的朋友可以参考一下

前面的文章已经描述过在蚂蚁金服开放平台创建应用签约等流程,详见:PHP App端支付宝支付,这里就不多说了,剩下的分两步,第一步是支付前的准备工作,也就是整合支付类文件,我已经整合好可以直接用,代码开始:

支付类文件总共三个:

<?php
class alipay_pc{
    /**
     * 签名字符串
     * @param $prestr 需要签名的字符串
     * @param $key 私钥
     * return 签名结果
     */
    function md5Sign($prestr, $key) {
        $prestr = $prestr . $key;
        return md5($prestr);
    }

    /**
     * 验证签名
     * @param $prestr 需要签名的字符串
     * @param $sign 签名结果
     * @param $key 私钥
     * return 签名结果
     */
    function md5Verify($prestr, $sign, $key) {
        $prestr = $prestr . $key;
        $mysgin = md5($prestr);

        if($mysgin == $sign) {
            return true;
        }
        else {
            return false;
        }
    }

    /**
     * 把数组所有元素,按照“参数=参数值”的模式用“&”字符拼接成字符串
     * @param $para 需要拼接的数组
     * return 拼接完成以后的字符串
     */
    function createLinkstring($para) {
        $arg  = "";
        while (list ($key, $val) = each ($para)) {
            $arg.=$key."=".$val."&";
        }
        //去掉最后一个&字符
        $arg = substr($arg,0,count($arg)-2);

        //如果存在转义字符,那么去掉转义
        if(get_magic_quotes_gpc()){$arg = stripslashes($arg);}

        return $arg;
    }
    /**
     * 把数组所有元素,按照“参数=参数值”的模式用“&”字符拼接成字符串,并对字符串做urlencode编码
     * @param $para 需要拼接的数组
     * return 拼接完成以后的字符串
     */
    function createLinkstringUrlencode($para) {
        $arg  = "";
        while (list ($key, $val) = each ($para)) {
            $arg.=$key."=".urlencode($val)."&";
        }
        //去掉最后一个&字符
        $arg = substr($arg,0,count($arg)-2);

        //如果存在转义字符,那么去掉转义
        if(get_magic_quotes_gpc()){$arg = stripslashes($arg);}

        return $arg;
    }
    /**
     * 除去数组中的空值和签名参数
     * @param $para 签名参数组
     * return 去掉空值与签名参数后的新签名参数组
     */
    function paraFilter($para) {
        $para_filter = array();
        while (list ($key, $val) = each ($para)) {
            if($key == "sign" || $key == "sign_type" || $val == "")continue;
            else	$para_filter[$key] = $para[$key];
        }
        return $para_filter;
    }
    /**
     * 对数组排序
     * @param $para 排序前的数组
     * return 排序后的数组
     */
    function argSort($para) {
        ksort($para);
        reset($para);
        return $para;
    }
    /**
     * 写日志,方便测试(看网站需求,也可以改成把记录存入数据库)
     * 注意:服务器需要开通fopen配置
     * @param $word 要写入日志里的文本内容 默认值:空值
     */
    function logResult($word=&#39;&#39;) {
        $fp = fopen("log.txt","a");
        flock($fp, LOCK_EX) ;
        fwrite($fp,"执行日期:".strftime("%Y%m%d%H%M%S",time())."\n".$word."\n");
        flock($fp, LOCK_UN);
        fclose($fp);
    }

    /**
     * 远程获取数据,POST模式
     * 注意:
     * 1.使用Crul需要修改服务器中php.ini文件的设置,找到php_curl.dll去掉前面的";"就行了
     * 2.文件夹中cacert.pem是SSL证书请保证其路径有效,目前默认路径是:getcwd().&#39;\\cacert.pem&#39;
     * @param $url 指定URL完整路径地址
     * @param $cacert_url 指定当前工作目录绝对路径
     * @param $para 请求的数据
     * @param $input_charset 编码格式。默认值:空值
     * return 远程输出的数据
     */
    function getHttpResponsePOST($url, $cacert_url, $para, $input_charset = &#39;&#39;) {

        if (trim($input_charset) != &#39;&#39;) {
            $url = $url."_input_charset=".$input_charset;
        }
        $curl = curl_init($url);
        curl_setopt($curl, CURLOPT_SSL_VERIFYPEER, true);//SSL证书认证
        curl_setopt($curl, CURLOPT_SSL_VERIFYHOST, 2);//严格认证
        curl_setopt($curl, CURLOPT_CAINFO,$cacert_url);//证书地址
        curl_setopt($curl, CURLOPT_HEADER, 0 ); // 过滤HTTP头
        curl_setopt($curl,CURLOPT_RETURNTRANSFER, 1);// 显示输出结果
        curl_setopt($curl,CURLOPT_POST,true); // post传输数据
        curl_setopt($curl,CURLOPT_POSTFIELDS,$para);// post传输数据
        $responseText = curl_exec($curl);
        //var_dump( curl_error($curl) );//如果执行curl过程中出现异常,可打开此开关,以便查看异常内容
        curl_close($curl);

        return $responseText;
    }

    /**
     * 远程获取数据,GET模式
     * 注意:
     * 1.使用Crul需要修改服务器中php.ini文件的设置,找到php_curl.dll去掉前面的";"就行了
     * 2.文件夹中cacert.pem是SSL证书请保证其路径有效,目前默认路径是:getcwd().&#39;\\cacert.pem&#39;
     * @param $url 指定URL完整路径地址
     * @param $cacert_url 指定当前工作目录绝对路径
     * return 远程输出的数据
     */
    function getHttpResponseGET($url,$cacert_url) {
        $curl = curl_init($url);
        curl_setopt($curl, CURLOPT_HEADER, 0 ); // 过滤HTTP头
        curl_setopt($curl,CURLOPT_RETURNTRANSFER, 1);// 显示输出结果
        curl_setopt($curl, CURLOPT_SSL_VERIFYPEER, true);//SSL证书认证
        curl_setopt($curl, CURLOPT_SSL_VERIFYHOST, 2);//严格认证
        curl_setopt($curl, CURLOPT_CAINFO,$cacert_url);//证书地址
        $responseText = curl_exec($curl);
        //var_dump( curl_error($curl) );//如果执行curl过程中出现异常,可打开此开关,以便查看异常内容
        curl_close($curl);

        return $responseText;
    }

    /**
     * 实现多种字符编码方式
     * @param $input 需要编码的字符串
     * @param $_output_charset 输出的编码格式
     * @param $_input_charset 输入的编码格式
     * return 编码后的字符串
     */
    function charsetEncode($input,$_output_charset ,$_input_charset) {
        $output = "";
        if(!isset($_output_charset) )$_output_charset  = $_input_charset;
        if($_input_charset == $_output_charset || $input ==null ) {
            $output = $input;
        } elseif (function_exists("mb_convert_encoding")) {
            $output = mb_convert_encoding($input,$_output_charset,$_input_charset);
        } elseif(function_exists("iconv")) {
            $output = iconv($_input_charset,$_output_charset,$input);
        } else die("sorry, you have no libs support for charset change.");
        return $output;
    }
    /**
     * 实现多种字符解码方式
     * @param $input 需要解码的字符串
     * @param $_output_charset 输出的解码格式
     * @param $_input_charset 输入的解码格式
     * return 解码后的字符串
     */
    function charsetDecode($input,$_input_charset ,$_output_charset) {
        $output = "";
        if(!isset($_input_charset) )$_input_charset  = $_input_charset ;
        if($_input_charset == $_output_charset || $input ==null ) {
            $output = $input;
        } elseif (function_exists("mb_convert_encoding")) {
            $output = mb_convert_encoding($input,$_output_charset,$_input_charset);
        } elseif(function_exists("iconv")) {
            $output = iconv($_input_charset,$_output_charset,$input);
        } else die("sorry, you have no libs support for charset changes.");
        return $output;
    }
}
<?php
/* *
 * 类名:AlipaySubmit
 * 功能:支付宝各接口请求提交类
 * 详细:构造支付宝各接口表单HTML文本,获取远程HTTP数据
 */
vendor("Alipaypc.alipay_pc");
class AlipaySubmit {

	var $alipay_config;
	/**
	 *支付宝网关地址(新)
	 */
	var $alipay_gateway_new = &#39;https://mapi.alipay.com/gateway.do?&#39;;

	function __construct($alipay_config){
		$this->alipay_config = $alipay_config;
	}
    function AlipaySubmit($alipay_config) {
    	$this->__construct($alipay_config);
    }
	
	/**
	 * 生成签名结果
	 * @param $para_sort 已排序要签名的数组
	 * return 签名结果字符串
	 */
	function buildRequestMysign($para_sort) {
		$alipaypc = new \Alipaypc();

		//把数组所有元素,按照“参数=参数值”的模式用“&”字符拼接成字符串
		$prestr = $alipaypc->createLinkstring($para_sort);
		
		$mysign = "";
		switch (strtoupper(trim($this->alipay_config[&#39;sign_type&#39;]))) {
			case "MD5" :
				$mysign = $alipaypc->md5Sign($prestr, $this->alipay_config[&#39;key&#39;]);
				break;
			default :
				$mysign = "";
		}
		
		return $mysign;
	}

	/**
     * 生成要请求给支付宝的参数数组
     * @param $para_temp 请求前的参数数组
     * @return 要请求的参数数组
     */
	function buildRequestPara($para_temp) {
		$alipaypc = new \Alipaypc();

		//除去待签名参数数组中的空值和签名参数
		$para_filter = $alipaypc->paraFilter($para_temp);

		//对待签名参数数组排序
		$para_sort = $alipaypc->argSort($para_filter);

		//生成签名结果
		$mysign = $this->buildRequestMysign($para_sort);
		
		//签名结果与签名方式加入请求提交参数组中
		$para_sort[&#39;sign&#39;] = $mysign;
		$para_sort[&#39;sign_type&#39;] = strtoupper(trim($this->alipay_config[&#39;sign_type&#39;]));
		
		return $para_sort;
	}

	/**
     * 生成要请求给支付宝的参数数组
     * @param $para_temp 请求前的参数数组
     * @return 要请求的参数数组字符串
     */
	function buildRequestParaToString($para_temp) {
		$alipaypc = new \Alipaypc();

		//待请求参数数组
		$para = $this->buildRequestPara($para_temp);
		
		//把参数组中所有元素,按照“参数=参数值”的模式用“&”字符拼接成字符串,并对字符串做urlencode编码
		$request_data = $alipaypc->createLinkstringUrlencode($para);
		
		return $request_data;
	}
	
    /**
     * 建立请求,以表单HTML形式构造(默认)
     * @param $para_temp 请求参数数组
     * @param $method 提交方式。两个值可选:post、get
     * @param $button_name 确认按钮显示文字
     * @return 提交表单HTML文本
     */
	function buildRequestForm($para_temp, $method, $button_name) {
		//待请求参数数组
		$para = $this->buildRequestPara($para_temp);
		
		$sHtml = "<form id=&#39;alipaysubmit&#39; name=&#39;alipaysubmit&#39; action=&#39;".$this->alipay_gateway_new."_input_charset=".trim(strtolower($this->alipay_config[&#39;input_charset&#39;]))."&#39; method=&#39;".$method."&#39;>";
		while (list ($key, $val) = each ($para)) {
            $sHtml.= "<input type=&#39;hidden&#39; name=&#39;".$key."&#39; value=&#39;".$val."&#39;/>";
        }

		//submit按钮控件请不要含有name属性
        $sHtml = $sHtml."<input type=&#39;submit&#39;  value=&#39;".$button_name."&#39; style=&#39;display:none;&#39;></form>";
		
		$sHtml = $sHtml."<script>document.forms[&#39;alipaysubmit&#39;].submit();</script>";
		
		return $sHtml;
	}
	
	
	/**
     * 用于防钓鱼,调用接口query_timestamp来获取时间戳的处理函数
	 * 注意:该功能PHP5环境及以上支持,因此必须服务器、本地电脑中装有支持DOMDocument、SSL的PHP配置环境。建议本地调试时使用PHP开发软件
     * return 时间戳字符串
	 */
	function query_timestamp() {
		$url = $this->alipay_gateway_new."service=query_timestamp&partner=".trim(strtolower($this->alipay_config[&#39;partner&#39;]))."&_input_charset=".trim(strtolower($this->alipay_config[&#39;input_charset&#39;]));
		$encrypt_key = "";		

		$doc = new DOMDocument();
		$doc->load($url);
		$itemEncrypt_key = $doc->getElementsByTagName( "encrypt_key" );
		$encrypt_key = $itemEncrypt_key->item(0)->nodeValue;
		
		return $encrypt_key;
	}
}
<?php
/* *
 * 类名:AlipayNotify
 * 功能:支付宝通知处理类
 * 详细:处理支付宝各接口通知返回
 * 版本:3.2
 *************************注意*************************
 * 调试通知返回时,可查看或改写log日志的写入TXT里的数据,来检查通知返回是否正常
 */

vendor("Alipaypc.Alipaypc");
class AlipayNotify {
    /**
     * HTTPS形式消息验证地址
     */
	var $https_verify_url = &#39;https://mapi.alipay.com/gateway.do?service=notify_verify&&#39;;
	/**
     * HTTP形式消息验证地址
     */
	var $http_verify_url = &#39;http://notify.alipay.com/trade/notify_query.do?&#39;;
	var $alipay_config;

	function __construct($alipay_config){
		$this->alipay_config = $alipay_config;
	}
    function AlipayNotify($alipay_config) {
    	$this->__construct($alipay_config);
    }
    /**
     * 针对notify_url验证消息是否是支付宝发出的合法消息
     * @return 验证结果
     */
	function verifyNotify(){
		$alipaypc = new \Alipaypc();
		if(empty($_POST)) {//判断POST来的数组是否为空
			return false;
		}
		else {
			//生成签名结果
			$isSign = $this->getSignVeryfy($_POST, $_POST["sign"]);
			//获取支付宝远程服务器ATN结果(验证是否是支付宝发来的消息)
			$responseTxt = &#39;false&#39;;
			if (! empty($_POST["notify_id"])) {$responseTxt = $this->getResponse($_POST["notify_id"]);}
			
			//写日志记录
			if ($isSign) {
				$isSignStr = &#39;true&#39;;
			}
			else {
				$isSignStr = &#39;false&#39;;
			}
			$log_text = "responseTxt=".$responseTxt."\n notify_url_log:isSign=".$isSignStr.",";
			$log_text = $log_text.$alipaypc->createLinkString($_POST);
			$alipaypc->logResult($log_text);
			
			//验证
			//$responsetTxt的结果不是true,与服务器设置问题、合作身份者ID、notify_id一分钟失效有关
			//isSign的结果不是true,与安全校验码、请求时的参数格式(如:带自定义参数等)、编码格式有关
			if (preg_match("/true$/i",$responseTxt) && $isSign) {
				return true;
			} else {
				return false;
			}
		}
	}
	
    /**
     * 针对return_url验证消息是否是支付宝发出的合法消息
     * @return 验证结果
     */
	function verifyReturn(){
		$alipaypc = new \Alipaypc();
		if(empty($_GET)) {//判断POST来的数组是否为空
			return false;
		}
		else {
			//生成签名结果
			$isSign = $this->getSignVeryfy($_GET, $_GET["sign"]);
			//获取支付宝远程服务器ATN结果(验证是否是支付宝发来的消息)
			$responseTxt = &#39;false&#39;;
			if (! empty($_GET["notify_id"])) {$responseTxt = $this->getResponse($_GET["notify_id"]);}
			
			//写日志记录
			if ($isSign) {
				$isSignStr = &#39;true&#39;;
			}
			else {
				$isSignStr = &#39;false&#39;;
			}
			$log_text = "responseTxt=".$responseTxt."\n return_url_log:isSign=".$isSignStr.",";
			$log_text = $log_text.$alipaypc->createLinkString($_GET);
			$alipaypc->logResult($log_text);
			
			//验证
			//$responsetTxt的结果不是true,与服务器设置问题、合作身份者ID、notify_id一分钟失效有关
			//isSign的结果不是true,与安全校验码、请求时的参数格式(如:带自定义参数等)、编码格式有关
			if (preg_match("/true$/i",$responseTxt) && $isSign) {
				return true;
			} else {
				return false;
			}
		}
	}
	
    /**
     * 获取返回时的签名验证结果
     * @param $para_temp 通知返回来的参数数组
     * @param $sign 返回的签名结果
     * @return 签名验证结果
     */
	function getSignVeryfy($para_temp, $sign) {
		$alipaypc = new \Alipaypc();
		//除去待签名参数数组中的空值和签名参数
		$para_filter = $alipaypc->paraFilter($para_temp);
		
		//对待签名参数数组排序
		$para_sort = $alipaypc->argSort($para_filter);
		
		//把数组所有元素,按照“参数=参数值”的模式用“&”字符拼接成字符串
		$prestr = $alipaypc->createLinkstring($para_sort);
		
		$isSgin = false;
		switch (strtoupper(trim($this->alipay_config[&#39;sign_type&#39;]))) {
			case "MD5" :
				$isSgin = $alipaypc->md5Verify($prestr, $sign, $this->alipay_config[&#39;key&#39;]);
				break;
			default :
				$isSgin = false;
		}
		
		return $isSgin;
	}

    /**
     * 获取远程服务器ATN结果,验证返回URL
     * @param $notify_id 通知校验ID
     * @return 服务器ATN结果
     * 验证结果集:
     * invalid命令参数不对 出现这个错误,请检测返回处理中partner和key是否为空 
     * true 返回正确信息
     * false 请检查防火墙或者是服务器阻止端口问题以及验证时间是否超过一分钟
     */
	function getResponse($notify_id) {
		$alipaypc = new \Alipaypc();
		$transport = strtolower(trim($this->alipay_config[&#39;transport&#39;]));
		$partner = trim($this->alipay_config[&#39;partner&#39;]);
		$veryfy_url = &#39;&#39;;
		if($transport == &#39;https&#39;) {
			$veryfy_url = $this->https_verify_url;
		}
		else {
			$veryfy_url = $this->http_verify_url;
		}
		$veryfy_url = $veryfy_url."partner=" . $partner . "&notify_id=" . $notify_id;
		$responseTxt = $alipaypc->getHttpResponseGET($veryfy_url, $this->alipay_config[&#39;cacert&#39;]);
		
		return $responseTxt;
	}
}

将上述的三个文件整合好后放到第三方类库,在控制器中引入并即可:

<?php
namespace app\huihui\controller\one;
use app\huihui\controller\A_Controller;
use app\huihui\model\MeetingOrder;
use think\Controller;
use think\Request;

/**
 * 支付宝PC端购票扫码支付
 */
vendor(&#39;Alipaypc.alipay_notify&#39;);
vendor(&#39;Alipaypc.alipay_submit&#39;);
vendor(&#39;Alipaypc.alipay_pc&#39;);
class Alipaypc extends A_Controller
{
    public $alipay_config = array(
        &#39;partner&#39; => &#39;&#39;,

        //收款支付宝账号,以2088开头由16位纯数字组成的字符串,一般情况下收款账号就是签约账号
        &#39;seller_id&#39; => &#39;&#39;,

        // MD5密钥,安全检验码,由数字和字母组成的32位字符串,查看地址:https://b.alipay.com/order/pidAndKey.htm
        &#39;key&#39; => &#39;&#39;,

        // 服务器异步通知页面路径  需http://格式的完整路径,不能加?id=123这类自定义参数,必须外网可以正常访问
        &#39;notify_url&#39;=> &#39;&#39;,

        // 页面跳转同步通知页面路径 需http://格式的完整路径,不能加?id=123这类自定义参数,必须外网可以正常访问
        &#39;return_url&#39; => &#39;&#39;,

        //字符编码格式 目前支持 gbk 或 utf-8
        &#39;input_charset&#39; => &#39;utf-8&#39;,

        //签名方式 不需修改
        &#39;sign_type&#39; => &#39;MD5&#39;,

        //ca证书路径地址,用于curl中ssl校验,请保证cacert.pem文件在当前文件夹目录中
        &#39;cacert&#39; => &#39;/cacert.pem&#39;,

        //访问模式,根据自己的服务器是否支持ssl访问,若支持请选择https;若不支持请选择http
        &#39;transport&#39; => &#39;http&#39;,

        // 支付类型 ,无需修改
        &#39;payment_type&#39; => &#39;1&#39;,

        // 产品类型,无需修改
        &#39;service&#39; => &#39;create_direct_pay_by_user&#39;,
    );

    //异步回调
    public function notifypc()
    {
        //计算得出通知验证结果
        $alipayNotify = new \AlipayNotify($this->alipay_config);
        $verify_result = $alipayNotify->verifyNotify();

        if($verify_result) {  //验证成功
            //获取支付宝的通知返回参数,可参考技术文档中服务器异步通知参数列表
            //商户订单号
            $out_trade_no = $_POST[&#39;out_trade_no&#39;];

            $order = new Order();   //实例化订单
            $ret = $order->getOrderN2($out_trade_no);  //查询订单信息

            if($_POST[&#39;trade_status&#39;] == &#39;TRADE_FINISHED&#39;) {
                //判断该笔订单是否在商户网站中已经做过处理
                //如果没有做过处理,根据订单号(out_trade_no)在商户网站的订单系统中查到该笔订单的详细,并执行商户的业务程序
                //请务必判断请求时的total_fee、seller_id与通知时获取的total_fee、seller_id为一致的
                //如果有做过处理,不执行商户的业务程序

                //注意:
                //退款日期超过可退款期限后(如三个月可退款),支付宝系统发送该交易状态通知
                //调试用,写文本函数记录程序运行情况是否正常
                //logResult("这里写入想要调试的代码变量值,或其他运行的结果记录");

                $total_amount=$ret[&#39;money&#39;];
                $total_fee = $_POST[&#39;total_fee&#39;];
                if($total_amount==$total_fee)
                {
                    //你的业务逻辑操作

                }else{//交易异常
                    logResult($_POST);
                }
            }else if ($_POST[&#39;trade_status&#39;] == &#39;TRADE_SUCCESS&#39;) {
                //判断该笔订单是否在商户网站中已经做过处理
                //如果没有做过处理,根据订单号(out_trade_no)在商户网站的订单系统中查到该笔订单的详细,并执行商户的业务程序
                //请务必判断请求时的total_fee、seller_id与通知时获取的total_fee、seller_id为一致的
                //如果有做过处理,不执行商户的业务程序

                //注意:
                //付款完成后,支付宝系统发送该交易状态通知
                //调试用,写文本函数记录程序运行情况是否正常
                //logResult("这里写入想要调试的代码变量值,或其他运行的结果记录");

                $total_amount=$ret[&#39;money&#39;];
                $total_fee = $_POST[&#39;total_fee&#39;];
                if($total_amount==$total_fee)
                {
                    //你的业务逻辑操作

                }else {//交易异常
                    logResult($_POST);
                }
            }
            echo "success";		//请不要修改或删除
        }else {
            //验证失败
            echo "fail";
            //调试用,写文本函数记录程序运行情况是否正常
            //logResult("这里写入想要调试的代码变量值,或其他运行的结果记录");
        }
    }

    //同步回调
    public function returnpc()
    {
        //计算得出通知验证结果
        $alipayNotify = new \AlipayNotify($this->alipay_config);
        $verify_result = $alipayNotify->verifyReturn();
        if($verify_result) {//验证成功
            //获取支付宝的通知返回参数,可参考技术文档中页面跳转同步通知参数列表

            //商户订单号
            $out_trade_no = $_GET[&#39;out_trade_no&#39;];

            $order = new Order();   //实例化订单
            $ret = $order->getOrderN2($out_trade_no);  //查询订单信息

            if($_GET[&#39;trade_status&#39;] == &#39;TRADE_FINISHED&#39; || $_GET[&#39;trade_status&#39;] == &#39;TRADE_SUCCESS&#39;) {
                //判断该笔订单是否在商户网站中已经做过处理
                //如果没有做过处理,根据订单号(out_trade_no)在商户网站的订单系统中查到该笔订单的详细,并执行商户的业务程序
                //如果有做过处理,不执行商户的业务程序
                $total_amount=$ret[&#39;money&#39;];
                $total_fee = $_GET[&#39;total_fee&#39;];
                if(floatval($total_amount)==floatval($total_fee))
                { //交易成功跳转
                    echo "<script>window.location.href=&#39;&#39;;</script>";
                }
                else
                {//交易异常跳转
                    echo "<script>window.location.href=&#39;";
                }
            }else {
                //交易失败跳转
                echo "<script>window.location.href=&#39;";
            }
        }else {
            //验证失败
            //如要调试,请看alipay_notify.php页面的verifyReturn函数
            echo "<script>window.location.href=&#39;&#39;;</script>";
        }
    }

    //调用统一下单接口生成预支付订单并把数据返回给APP
    public function alipaypc(Request $request)
    {
        $param = $request->param(); //接收值
        $out_trade_no = $param[&#39;orderCode&#39;];//订单号
        $money = MeetingOrder::where(&#39;orderCode&#39;, $out_trade_no)->value(&#39;money&#39;);
        //商户订单号,商户网站订单系统中唯一订单号,必填
        $out_trade_no = $out_trade_no;
        //订单名称,必填
        $subject = &#39;&#39;; //自定义
        //付款金额,必填
        $total_fee = $money;
        //收银台页面上,商品展示的超链接,必填
        $show_url = &#39;&#39;;//自定义
        //商品描述,可空
        $body = &#39;&#39;; //自定义

        //构造要请求的参数数组,无需改动
        $parameter = array(
            "service"       => $this->alipay_config[&#39;service&#39;],
            "partner"       => $this->alipay_config[&#39;partner&#39;],
            "seller_id"  => $this->alipay_config[&#39;seller_id&#39;],
            "payment_type"	=> $this->alipay_config[&#39;payment_type&#39;],
            "notify_url"	=> $this->alipay_config[&#39;notify_url&#39;],
            "return_url"	=> $this->alipay_config[&#39;return_url&#39;],
            "_input_charset"	=> trim(strtolower($this->alipay_config[&#39;input_charset&#39;])),
            "out_trade_no"	=> $out_trade_no,
            "subject"	=> $subject,
            "total_fee"	=> $total_fee,
            "show_url"	=> $show_url,
            "body"	=> $body,
            //其他业务参数根据在线开发文档,添加参数.文档地址:https://doc.open.alipay.com/doc2/detail.htm?spm=a219a.7629140.0.0.2Z6TSk&treeId=60&articleId=103693&docType=1
            //如"参数名"	=> "参数值"   注:上一个参数末尾需要“,”逗号。
        );
        //建立请求
        $alipaySubmit = new \AlipaySubmit($this->alipay_config);
        $html_text = $alipaySubmit->buildRequestForm($parameter,"get", "确认");
        echo $html_text;
    }
}

到这里就结束了,在控制器中的方法内是需要有一些替换成你自己的东西,比如查询订单,支付成功后的业务逻辑等,仔细排查一遍代码将相应的地方改为自己的,如果不出意外扫码支付已经成功了,赶紧去试试是否可以调起扫码支付功能啦!!!

以上就是本文的全部内容,希望对大家的学习有所帮助,更多相关内容请关注PHP中文网!

相关推荐:

PHP APP端微信支付的方法

以上がPHPを使用したPCでのAlipayスキャンコード支払いの紹介の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
誇大広告を超えて:今日のPHPの役割の評価誇大広告を超えて:今日のPHPの役割の評価Apr 12, 2025 am 12:17 AM

PHPは、特にWeb開発の分野で、最新のプログラミングで強力で広く使用されているツールのままです。 1)PHPは使いやすく、データベースとシームレスに統合されており、多くの開発者にとって最初の選択肢です。 2)動的コンテンツ生成とオブジェクト指向プログラミングをサポートし、Webサイトを迅速に作成および保守するのに適しています。 3)PHPのパフォーマンスは、データベースクエリをキャッシュおよび最適化することで改善でき、その広範なコミュニティと豊富なエコシステムにより、今日のテクノロジースタックでは依然として重要になります。

PHPの弱い参照は何ですか、そしていつ有用ですか?PHPの弱い参照は何ですか、そしていつ有用ですか?Apr 12, 2025 am 12:13 AM

PHPでは、弱い参照クラスを通じて弱い参照が実装され、ガベージコレクターがオブジェクトの回収を妨げません。弱い参照は、キャッシュシステムやイベントリスナーなどのシナリオに適しています。オブジェクトの生存を保証することはできず、ごみ収集が遅れる可能性があることに注意する必要があります。

PHPで__invoke Magicメソッドを説明してください。PHPで__invoke Magicメソッドを説明してください。Apr 12, 2025 am 12:07 AM

\ _ \ _ Invokeメソッドを使用すると、オブジェクトを関数のように呼び出すことができます。 1。オブジェクトを呼び出すことができるように\ _ \ _呼び出しメソッドを定義します。 2。$ obj(...)構文を使用すると、PHPは\ _ \ _ Invokeメソッドを実行します。 3。ロギングや計算機、コードの柔軟性の向上、読みやすさなどのシナリオに適しています。

同時性については、PHP 8.1の繊維を説明します。同時性については、PHP 8.1の繊維を説明します。Apr 12, 2025 am 12:05 AM

繊維はPhp8.1で導入され、同時処理機能が改善されました。 1)繊維は、コルーチンと同様の軽量の並行性モデルです。 2)開発者がタスクの実行フローを手動で制御できるようにし、I/O集約型タスクの処理に適しています。 3)繊維を使用すると、より効率的で応答性の高いコードを書き込むことができます。

PHPコミュニティ:リソース、サポート、開発PHPコミュニティ:リソース、サポート、開発Apr 12, 2025 am 12:04 AM

PHPコミュニティは、開発者の成長を支援するための豊富なリソースとサポートを提供します。 1)リソースには、公式のドキュメント、チュートリアル、ブログ、LaravelやSymfonyなどのオープンソースプロジェクトが含まれます。 2)StackOverFlow、Reddit、およびSlackチャネルを通じてサポートを取得できます。 3)開発動向は、RFCに従うことで学ぶことができます。 4)コミュニティへの統合は、積極的な参加、コード共有への貢献、および学習共有への貢献を通じて達成できます。

PHP対Python:違いを理解しますPHP対Python:違いを理解しますApr 11, 2025 am 12:15 AM

PHP and Python each have their own advantages, and the choice should be based on project requirements. 1.PHPは、シンプルな構文と高い実行効率を備えたWeb開発に適しています。 2。Pythonは、簡潔な構文とリッチライブラリを備えたデータサイエンスと機械学習に適しています。

PHP:それは死にかけていますか、それとも単に適応していますか?PHP:それは死にかけていますか、それとも単に適応していますか?Apr 11, 2025 am 12:13 AM

PHPは死にかけていませんが、常に適応して進化しています。 1)PHPは、1994年以来、新しいテクノロジーの傾向に適応するために複数のバージョンの反復を受けています。 2)現在、電子商取引、コンテンツ管理システム、その他の分野で広く使用されています。 3)PHP8は、パフォーマンスと近代化を改善するために、JITコンパイラおよびその他の機能を導入します。 4)Opcacheを使用してPSR-12標準に従って、パフォーマンスとコードの品質を最適化します。

PHPの未来:適応と革新PHPの未来:適応と革新Apr 11, 2025 am 12:01 AM

PHPの将来は、新しいテクノロジーの傾向に適応し、革新的な機能を導入することで達成されます。1)クラウドコンピューティング、コンテナ化、マイクロサービスアーキテクチャに適応し、DockerとKubernetesをサポートします。 2)パフォーマンスとデータ処理の効率を改善するために、JITコンパイラと列挙タイプを導入します。 3)パフォーマンスを継続的に最適化し、ベストプラクティスを促進します。

See all articles

ホットAIツール

Undresser.AI Undress

Undresser.AI Undress

リアルなヌード写真を作成する AI 搭載アプリ

AI Clothes Remover

AI Clothes Remover

写真から衣服を削除するオンライン AI ツール。

Undress AI Tool

Undress AI Tool

脱衣画像を無料で

Clothoff.io

Clothoff.io

AI衣類リムーバー

AI Hentai Generator

AI Hentai Generator

AIヘンタイを無料で生成します。

ホットツール

メモ帳++7.3.1

メモ帳++7.3.1

使いやすく無料のコードエディター

SecLists

SecLists

SecLists は、セキュリティ テスターの究極の相棒です。これは、セキュリティ評価中に頻繁に使用されるさまざまな種類のリストを 1 か所にまとめたものです。 SecLists は、セキュリティ テスターが必要とする可能性のあるすべてのリストを便利に提供することで、セキュリティ テストをより効率的かつ生産的にするのに役立ちます。リストの種類には、ユーザー名、パスワード、URL、ファジング ペイロード、機密データ パターン、Web シェルなどが含まれます。テスターはこのリポジトリを新しいテスト マシンにプルするだけで、必要なあらゆる種類のリストにアクセスできるようになります。

DVWA

DVWA

Damn Vulnerable Web App (DVWA) は、非常に脆弱な PHP/MySQL Web アプリケーションです。その主な目的は、セキュリティ専門家が法的環境でスキルとツールをテストするのに役立ち、Web 開発者が Web アプリケーションを保護するプロセスをより深く理解できるようにし、教師/生徒が教室環境で Web アプリケーションを教え/学習できるようにすることです。安全。 DVWA の目標は、シンプルでわかりやすいインターフェイスを通じて、さまざまな難易度で最も一般的な Web 脆弱性のいくつかを実践することです。このソフトウェアは、

ドリームウィーバー CS6

ドリームウィーバー CS6

ビジュアル Web 開発ツール

WebStorm Mac版

WebStorm Mac版

便利なJavaScript開発ツール