php 如何用op浏览器开发手机网站,PHP实现手机网站支付(兼容微信浏览器)

news/2024/5/20 12:31:31/文章来源:https://blog.csdn.net/weixin_39936558/article/details/115573015

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

推荐:《PHP视频教程》

一个PHP文件搞定支付宝系列:https://github.com/dedemao/alipay

一个PHP文件搞定微信支付系列:https://github.com/dedemao/weixinPay

在手机浏览器下打开实现效果

a4c3390ca3815ff2879e03df9a5fe378.png

98a757465f57f479b7a1dbdcc1362333.png

在微信中打开实现效果

6276dfc0c8cbe5781bd8d7e31b882f30.png

注:兼容微信浏览器需依赖支付宝官方提供的demo(alipay_in_weixin_demo)中的两个文件,即:ap.js及pay.htm

环境依赖

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

如需兼容微信浏览器,还需依赖ap.js及pay.htm。

注意事项

1.文件开头的配置信息必须完善

2.商户私钥需填写对应签名算法类型的私钥,如何生成密钥参考:

2.1 https://docs.open.alipay.com/291/105971

2.2 https://docs.open.alipay.com/200/105310

代码<?php

header('Content-type:text/html; Charset=utf-8');

$appid = 'xxxxx'; //https://open.alipay.com 账户中心->密钥管理->开放平台密钥,填写添加了电脑网站支付的应用的APPID

$returnUrl = 'http://www.xxx.com/alipay/return.php'; //付款成功后的同步回调地址

$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/1j8AgsoD9lLyxoFqxLj98k5ZrYIhk900gMQs/WJ3A1FC09Dln9fuhBUyjtPHaml+4w+sdkdzxPktxdFrMcI7M7rNEwg25XtST5Z49oFpE84AlXM7+oC9jYvIpTGE00WomsgtakN039ucT/59Bup6pLkO08Rv85UXbqzGTcYAhNHLfQIDAQABAoIBAQCbuPM58s+j8KgB8ty5yiqRPoeaj+O2h4Txn7A02/sfPQvNtCI0wsTpT5twsihULo+EVYTxJCitUn7df2sP5pyGzTEd5njLRtNu4Zvhj+Thjf1grERiu9b4oXI/WRzjLRxzi+uREi40OK+fWi0xgxDCdROY/eNiEdJfV8zpaqsUxG7VdwZIJQ/8d3Mi31OWv30kr9jfEd15DBInGJgSqR+qwrAB4pBSMcW8hL6PYlzoPi1ygceFjRrnbeMG40zt0OUPSexQIgAmFvGqxTl5xo3dFEziGHdfWYsBKZ2M8ubAe+R6LcndxI+o2Hw4TNcC1tDeNMtjw7+h9S5aef5A8uWBAoGBAPxCLWPhUHCYlIXUz0D1SoolZs9WK7Kz1YSWnzqrpegN+foS5/ji93YylGE+KL31TwbnGQLAwknwMX3qTzmkvTovmy8jevXBsCSEFm81q0wG/35e1SKkTXL66RqB2y0xFLdcF3f9s8ZiEclqkYwNSHh0nqzREfIxMMAsj+3n2vHdAoGBANftYkZYrbs4iI/ZcjmBYguYikNfNmrD+Ta6ckOGZqsHfwXJCAz1rF4/XCqVAc9nxuzJR/72qkn9z07uH6qSZCqlZDRki2KaK2UVqFDB+0abMk/TGHXuMmdvMkyj2jEZxG2rkg0kmg4qYkkg/5tGG1On/0GeZNVPu8JpsFr1pDYhAoGBANr8pCTKC6fDfWP1C3qrtmrY7zhc6RB4d4pjq5UmP5+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);

$payConfigs = $aliPay->doPay($payAmount,$outTradeNo,$orderName,$returnUrl,$notifyUrl);

class AlipayService

{

protected $appId;

protected $returnUrl;

protected $notifyUrl;

protected $charset;

//私钥值

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,

'product_code'=>'QUICK_WAP_WAY',

'total_amount'=>$totalFee, //单位 元

'subject'=>$orderName, //订单标题

);

$commonConfigs = array(

//公共参数

'app_id' => $this->appId,

'method' => 'alipay.trade.wap.pay', //接口名称

'format' => 'JSON',

'return_url' => $returnUrl,

'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']);

return $commonConfigs;

}

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', '

} 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);

}

}

return $data;

}

}

function isWeixin(){

if ( strpos($_SERVER['HTTP_USER_AGENT'],'MicroMessenger') !== false ) {

return true;

}

return false;

}

$queryStr = http_build_query($payConfigs);

if(isWeixin()):

?>

var gotoUrl = 'https://openapi.alipay.com/gateway.do?=$queryStr?>';

_AP.pay(gotoUrl);

else:

header("Location:https://openapi.alipay.com/gateway.do?{$queryStr}");

endif;

?>

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.luyixian.cn/news_show_728010.aspx

如若内容造成侵权/违法违规/事实不符,请联系dt猫网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

onmouseover和onmouseout在Repeater控件中应用

如果你曾看过这篇&#xff0c;http://www.cnblogs.com/insus/articles/1411057.html &#xff0c;它是在GridView控件中演示&#xff0c;但是它的方法在Repeater控件是无法复制的。由于看到论坛上有网友问及&#xff0c;花上一点点时间做了Repeater控件的演示。首先看看效果(动…

22个优秀的网站后台管理面板模版

在一些网站开发过程中&#xff0c;有非常多的例子是关于怎么学习如何创建网站前台设计&#xff0c;但是处理后台的文章是非常少&#xff0c;这篇文章将整理出22个非常优秀的管理后台面板模版帮助你减少网站的后台开发&#xff0c;节省时间。访问下面这些列表&#xff0c;选择您…

使用Varnish代替Squid做网站缓存加速器的详细解决方案

今天写的这篇关于Varnish的文章&#xff0c;已经是一篇可以完全替代Squid做网站缓存加速器的详细解决方案了。网上关于Varnish的资料很少&#xff0c;中文资料更是微乎其微&#xff0c;希望本文能够吸引更多的人研究、使用Varnish。   在我看来&#xff0c;使用Varnish代替Sq…

iis10 asp 如何连接mdb_如何攻破一个网站

原标题&#xff1a;如何攻破一个网站通过本文你将了解黑客常用的入手思路和技术手法&#xff0c;适合热爱网络信息安全的新手朋友了解学习。本文将从最开始的信息收集开始讲述黑客是如何一步步的攻破你的网站和服务器的。阅读本文你会学到以下内容&#xff1a;1.渗透测试前的简…

数据太多加滚动标题不动_SEO怎么对页面标题优化,页面优化要注意什么?

页面的标题主要是规定了一些网页的内容&#xff0c;然后去告诉搜索引擎蜘蛛这个页面的大概内容&#xff0c;页面标题也就是搜索引擎来判断页面内容的主要参考信息&#xff0c;这就是网页优化最重要的因素。SEO去优化页面标题可以从下面几方面入手(1)相关且准确每个页面标题都要…

建站模板论坛_运营自建站并不难!SHOPYY教你快速建站及精准引流

自建站一直是跨境电商圈中热议的话题。相较于平台&#xff0c;自建站有更大的发挥空间&#xff0c;不受条款限制。不过大部分卖家的印象都停留在“难”上。因为他们在做自建站之后只有少数能做起来。而运营难度究竟有多高&#xff0c;怎样才是正确的建站姿势呢?自建站做不起来…

springboot访问静态页面404_网站404是什么原因,网站404怎么解决

404对于SEO的影响是非常严重的。一旦处理不当网站就会被K&#xff0c;轻微的是降权。所以死链接的处理一定要用正规的处理方式。而更加重要的就是预防404&#xff0c;因为企赢SEO优化那么多网站从来没有出现过死链接这东西。首先我们要知道404出现的原因有哪些&#xff0c;才能…

纯html静态网站_Python爬虫抓取纯静态网站及其资源 !这个项目挣了10k!

遇到的需求前段时间需要快速做个静态展示页面&#xff0c;要求是响应式和较美观。由于时间较短&#xff0c;自己动手写的话也有点麻烦&#xff0c;所以就打算上网找现成的。中途找到了几个页面发现不错&#xff0c;然后就开始思考怎么把页面给下载下来。由于之前还没有了解过爬…

加密狗 加密.net网站_实战案例浅析JS加密 RSA与XXTEA

这次要研究的网站采用的是rsa加密以及xxtea。这里先复习下上一篇讲过的调试流程基础版:如果网页有跳转&#xff0c;必须勾选 preservelog 防止丢包看一下有没有框架 右键查看框架源代码(弹出式登陆界面)登陆尽量使用错误密码 防止跳转查看关键登陆包 分析哪些参数是加密的使用别…

在html中加入搜索词条,如何为网站添加关键字与描述信息

meat标签的奥妙META标签&#xff0c;是HTML语言head区的一个辅助性标签。在几乎所有的page里&#xff0c;我们都可以看到类似下面这段html代码&#xff1a;这就是meta标签的典型运用。meta标签有多少参数&#xff0c;有什么作用&#xff0c;为什么我们要特别重视它呢&#xff1…

Sassaparilla – 简单、快速的创建响应式网站

Sassaparilla 是一组创建响应式网站的规则和风格&#xff0c;Sassaparilla 使用 Sass 和 Compass 建立灵活的可重用的样式表&#xff0c;帮助你简单、快速的创建出响应式网站。 您可能感兴趣的相关文章基于拖放布局的 Twitter Bootstrap 网站生成器Superhero&#xff1a;构建大…

php网站选择什么服务器配置,php选择什么服务器配置

php选择什么服务器配置 内容精选换一换华为云帮助中心&#xff0c;为用户提供产品简介、价格说明、购买指南、用户指南、API参考、最佳实践、常见问题、视频帮助等技术文档&#xff0c;帮助您快速上手使用华为云服务。简要介绍WebSVN是一个基于Web的Subversion Repository浏览器…

优秀设计:12个带给你灵感的创意单页网站作品

单页网站作为一个流行趋势已有一段时间了&#xff0c;但他们的受欢迎程度似乎并没有任何减少。这种页面设计方法并不适用于每个项目&#xff0c;但有时它是合适的&#xff0c;是有意义的。例如&#xff0c;当没有很多内容&#xff0c;而且你知道的内容在未来不会增长很多&#…

织梦建站第一课(上):搭建织梦本地调试环境

织梦建站第一课&#xff08;上&#xff09;&#xff1a;搭建织梦本地调试环境1织梦简介该步骤可做也可不做&#xff0c;因为如果你想在你的真机上安装织梦本地环境可以&#xff0c;如果选择本地安装则跳过此步&#xff0c;也可以在虚拟机中安装&#xff0c;案例中我在虚拟机中安…

网站打开速度慢如何压缩图片_8个免费实用的图片压缩网站、软件(含下载地址)吐血推荐...

很多朋友在生活、工作中都会遇到图片太大的情况&#xff0c;影响导出、存储。这个时候就需要我们压缩图片或者干脆换掉图片。但是换图是一件很影响效率的事情&#xff0c;找到中意的替代图片可不是件容易的事情。所以今天我给大家整理了一个在线图片压缩网站及软件合辑&#xf…

可以发外链的网站_seo排名就是发外链,网站运营就是写文章

seo排名就是发外链&#xff0c;网站运营就是写文章。常规的菜鸟和从业seo几年的人对于seo和网站运营的理解&#xff0c;基本就在于此。1.seo排名就是发外链我从参加线上网络营销的培训班&#xff0c;在里面学习了seo的一些基本理论和皮毛之后我就开始接企业网站关键词seo排名的…

多吉搜索不能用了_百度停更!火狐插件失效?5个资源搜索网站送给你,搜一下很简单...

在五一放假之前&#xff0c;百度方面就发布了公告&#xff0c;表示将在月底停止更新PC端的百度浏览器&#xff0c;并且一些百度产品也不能在使用&#xff0c;一开始没注意&#xff0c;结果打开电脑中的浏览器突然发现&#xff0c;嗯&#xff1f;我收藏在页面的网站咋都没了&…

html怎么快速收录,新网站上线后如何实现快速收录的原理

SEOer一般都会动手为自己搭建一个网站&#xff0c;一般以个人博客类为主流。对于刚刚入行的SEOer来说&#xff0c;搭建个人博客的目的大致相同。一方面是作为学*结经验使用&#xff0c;也就是拿来练练手&#xff0c;熟悉作业学习经验;一方面也是想能够把关键词优化上首页&#…

关于UI资源获取资源的好的网站

前言&#xff1a;和我一样喜欢UI的一定喜欢这里的内容。 下面是关于sketch资源获取网页&#xff0c;点击图片就能进入&#xff1a; 连接是&#xff1a;https://github.com/JakeLin 居然意外百度到Sketch中国&#xff0c;还提供sketch破解版下载哦&#xff1a;http://www.sketch…

mysql 触发器 增删改写在一起_MYSQL在线学习网站

SQL初步学习1、书籍《SQL必知必会》初学学习SQL语句必备书籍&#xff0c;本书没有涉及理论&#xff0c;而是直接介绍不同平台上数据的排序&#xff0c;过滤和分组&#xff0c;以及表&#xff0c;视图&#xff0c;联结&#xff0c;子查询&#xff0c;游标&#xff0c;储存过程和…