700字范文,内容丰富有趣,生活中的好帮手!
700字范文 > PHP PC端支付宝扫码支付的介绍

PHP PC端支付宝扫码支付的介绍

时间:2023-12-30 21:20:46

相关推荐

PHP PC端支付宝扫码支付的介绍

后端开发|php教程

PHP PC端

后端开发-php教程

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

时时彩 源码下载,ubuntu文件被覆盖,tomcat下项目为空,小爬虫 客服,php数据库商城,seo组词lzw

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

ios 6开发范例代码大全源码,VScode环境协同,ubuntu 的gpu使用情况,关于tomcat插件,sqlite 多线程同步,php视频直播插件,最值得学的前端框架,花草爬虫怎么治,php 类与对象,宁夏外贸seo,静态网站论文目录,手机看网页flv视频播放器下载,简洁大方的网站模板,汽车解压程序lzw

支付类文件总共三个:

ti的最新dsp28335的ad采样源码,vscode终端编辑模式,Ubuntu玩文明,tomcat日志配置分离,爬虫 streamevent,php 去除图片,坪山seo优化代理,小说网站阅读模板下载,简单主页模板下载安装lzw

<?phpclass 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=\) { $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().\\cacert.pem* @param $url 指定URL完整路径地址* @param $cacert_url 指定当前工作目录绝对路径* @param $para 请求的数据* @param $input_charset 编码格式。默认值:空值* return 远程输出的数据*/ function getHttpResponsePOST($url, $cacert_url, $para, $input_charset = \) { if (trim($input_charset) != \) { $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().\\cacert.pem* @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; }}

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[sign_type]))) {case "MD5" :$mysign = $alipaypc->md5Sign($prestr, $this->alipay_config[key]);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[sign] = $mysign;$para_sort[sign_type] = strtoupper(trim($this->alipay_config[sign_type]));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 = "alipay_gateway_new."_input_charset=".trim(strtolower($this->alipay_config[input_charset]))." method=\".$method.">";while (list ($key, $val) = each ($para)) { $sHtml.= ""; }//submit按钮控件请不要含有name属性 $sHtml = $sHtml."";$sHtml = $sHtml."document.forms[alipaysubmit].submit();";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[partner]))."&_input_charset=".trim(strtolower($this->alipay_config[input_charset]));$encrypt_key = "";$doc = new DOMDocument();$doc->load($url);$itemEncrypt_key = $doc->getElementsByTagName( "encrypt_key" );$encrypt_key = $itemEncrypt_key->item(0)->nodeValue;return $encrypt_key;}}

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 = false;if (! empty($_POST["notify_id"])) {$responseTxt = $this->getResponse($_POST["notify_id"]);}//写日志记录if ($isSign) {$isSignStr = rue;}else {$isSignStr = false;}$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 = false;if (! empty($_GET["notify_id"])) {$responseTxt = $this->getResponse($_GET["notify_id"]);}//写日志记录if ($isSign) {$isSignStr = rue;}else {$isSignStr = false;}$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[sign_type]))) {case "MD5" :$isSgin = $alipaypc->md5Verify($prestr, $sign, $this->alipay_config[key]);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[ ransport]));$partner = trim($this->alipay_config[partner]);$veryfy_url = \;if($transport == https) {$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[cacert]);return $responseTxt;}}

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

\, //收款支付宝账号,以2088开头由16位纯数字组成的字符串,一般情况下收款账号就是签约账号 seller_id => \, // MD5密钥,安全检验码,由数字和字母组成的32位字符串,查看地址:/order/pidAndKey.htm key => \, // 服务器异步通知页面路径 需http://格式的完整路径,不能加?id=123这类自定义参数,必须外网可以正常访问 otify_url=> \, // 页面跳转同步通知页面路径 需http://格式的完整路径,不能加?id=123这类自定义参数,必须外网可以正常访问 eturn_url => \, //字符编码格式 目前支持 gbk 或 utf-8 input_charset => utf-8, //签名方式 不需修改 sign_type => MD5, //ca证书路径地址,用于curl中ssl校验,请保证cacert.pem文件在当前文件夹目录中 cacert => /cacert.pem, //访问模式,根据自己的服务器是否支持ssl访问,若支持请选择https;若不支持请选择http ransport => http, // 支付类型 ,无需修改 payment_type => 1, // 产品类型,无需修改 service => create_direct_pay_by_user, ); //异步回调 public function notifypc() { //计算得出通知验证结果 $alipayNotify = new \AlipayNotify($this->alipay_config); $verify_result = $alipayNotify->verifyNotify(); if($verify_result) { //验证成功 //获取支付宝的通知返回参数,可参考技术文档中服务器异步通知参数列表 //商户订单号 $out_trade_no = $_POST[out_trade_no]; $order = new Order(); //实例化订单 $ret = $order->getOrderN2($out_trade_no); //查询订单信息 if($_POST[ rade_status] == TRADE_FINISHED) {//判断该笔订单是否在商户网站中已经做过处理//如果没有做过处理,根据订单号(out_trade_no)在商户网站的订单系统中查到该笔订单的详细,并执行商户的业务程序//请务必判断请求时的total_fee、seller_id与通知时获取的total_fee、seller_id为一致的//如果有做过处理,不执行商户的业务程序//注意://退款日期超过可退款期限后(如三个月可退款),支付宝系统发送该交易状态通知//调试用,写文本函数记录程序运行情况是否正常//logResult("这里写入想要调试的代码变量值,或其他运行的结果记录");$total_amount=$ret[money];$total_fee = $_POST[ otal_fee];if($total_amount==$total_fee){ //你的业务逻辑操作}else{//交易异常 logResult($_POST);} }else if ($_POST[ rade_status] == TRADE_SUCCESS) {//判断该笔订单是否在商户网站中已经做过处理//如果没有做过处理,根据订单号(out_trade_no)在商户网站的订单系统中查到该笔订单的详细,并执行商户的业务程序//请务必判断请求时的total_fee、seller_id与通知时获取的total_fee、seller_id为一致的//如果有做过处理,不执行商户的业务程序//注意://付款完成后,支付宝系统发送该交易状态通知//调试用,写文本函数记录程序运行情况是否正常//logResult("这里写入想要调试的代码变量值,或其他运行的结果记录");$total_amount=$ret[money];$total_fee = $_POST[ otal_fee];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[out_trade_no]; $order = new Order(); //实例化订单 $ret = $order->getOrderN2($out_trade_no); //查询订单信息 if($_GET[ rade_status] == TRADE_FINISHED || $_GET[ rade_status] == TRADE_SUCCESS) {//判断该笔订单是否在商户网站中已经做过处理//如果没有做过处理,根据订单号(out_trade_no)在商户网站的订单系统中查到该笔订单的详细,并执行商户的业务程序//如果有做过处理,不执行商户的业务程序$total_amount=$ret[money];$total_fee = $_GET[ otal_fee];if(floatval($total_amount)==floatval($total_fee)){ //交易成功跳转 echo "window.location.href=\;";}else{//交易异常跳转 echo "window.location.href=\";} }else {//交易失败跳转echo "window.location.href=\"; } }else { //验证失败 //如要调试,请看alipay_notify.php页面的verifyReturn函数 echo "window.location.href=\;"; } } //调用统一下单接口生成预支付订单并把数据返回给APP public function alipaypc(Request $request) { $param = $request->param(); //接收值 $out_trade_no = $param[orderCode];//订单号 $money = MeetingOrder::where(orderCode, $out_trade_no)->value(money); //商户订单号,商户网站订单系统中唯一订单号,必填 $out_trade_no = $out_trade_no; //订单名称,必填 $subject = \; //自定义 //付款金额,必填 $total_fee = $money; //收银台页面上,商品展示的超链接,必填 $show_url = \;//自定义 //商品描述,可空 $body = \; //自定义 //构造要请求的参数数组,无需改动 $parameter = array( "service" => $this->alipay_config[service], "partner" => $this->alipay_config[partner], "seller_id" => $this->alipay_config[seller_id], "payment_type"=> $this->alipay_config[payment_type], "notify_url"=> $this->alipay_config[ otify_url], "return_url"=> $this->alipay_config[ eturn_url], "_input_charset"=> trim(strtolower($this->alipay_config[input_charset])), "out_trade_no"=> $out_trade_no, "subject"=> $subject, "total_fee"=> $total_fee, "show_url"=> $show_url, "body"=> $body, //其他业务参数根据在线开发文档,添加参数.文档地址:https://doc./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; }}

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

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。