PHP实现手机网站支付(兼容微信浏览器)

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

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

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

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

企业微信截图_15986782371799.png

企业微信截图_15986783072275.png

在微信中打开实现效果

企业微信截图_15986783165039.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', '<') ? 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);
            }
        }
        return $data;
    }
}
function isWeixin(){
    if ( strpos($_SERVER['HTTP_USER_AGENT'],'MicroMessenger') !== false ) {
        return true;
    }
    return false;
}
$queryStr = http_build_query($payConfigs);
if(isWeixin()):
?>
<script type="text/javascript" src="ap.js"></script>
<script>
    var gotoUrl = 'https://openapi.alipay.com/gateway.do?<?=$queryStr?>';
    _AP.pay(gotoUrl);
</script>
<?php
    else:
        header("Location:https://openapi.alipay.com/gateway.do?{$queryStr}");
    endif;
?>

关于PHP实现手机网站支付(兼容微信浏览器)的文章就分享到这,如果对你有帮助欢迎继续关注我们哦

本文来自投稿,不代表重蔚自留地立场,如若转载,请注明出处https://www.cwhello.com/40966.html

如有侵犯您的合法权益请发邮件951076433@qq.com联系删除

(0)
php学习php学习订阅用户
上一篇 2022年6月18日 23:56
下一篇 2022年6月18日 23:57

相关推荐

  • 小编教你支付宝乘车码开通不了是怎么回事?。

    支付宝乘车码开通不了。对于南京、天津、武汉等地的市民朋友来说,现在,他们已经完全不需要担心,坐公交的时候没有零钱、或者公交卡里没钱,而死活找不到继续乘车的方法,因为现在,他们的多条公交线路,已经能够…

    2023年11月4日
    019
  • 今日分享 支付宝登录密码怎么设置。

    支付宝在我们生活中有着非常广泛的使用,不管是日常消费,还是坐公交地图,甚至在医院挂号的时候,也可以使用支付宝功能。支付宝对于很多用户来说,已经是一个必备的随身钱包了,既然是钱包就一定要重视密码的设置…

    2023年10月19日
    039
  • 小编教你支付宝限制14天有人解开过吗。

    支付宝限制14天,一般都是不支持提前解冻的。而且支付宝限制14天的都不是特别严重的问题,支付宝官方既然给了这方面的惩罚,那么就老老实实等到时间结束就行了。很多人的手机里面都有安装支付宝软件,这是我们常用…

    2023年10月29日
    0201
  • 警惕!!!仅凭一张快递单就能扒出一个人这么多个人信息。

    只要发布在网络上,没有任何信息能保证安全。给我一张快递单,还原99%的你。 打开手机,常用的几个APP就那么几个,某信、某博、某宝、某支付、某云音乐… 它们顶着各家名号,在不同领域牢守阵地,看似毫无关联,并且…

    2017年3月10日 个人杂笔
    0499
  • 今日分享淘花结算了怎么没到支付宝。

    那是因为淘花平台当月服务费会在次月的第10个工作日进行结算,而且结算的是上一个自然月内的已经确认并收货的订单的佣金。说到推广赚钱,大家肯定听说过淘花,淘花的诞生志在推动数字化商品产业链的繁荣和共同发展…

    2023年10月29日
    00
  • 关于支付宝骑士卡加油真的打折吗。

    骑士卡加油真的打折。不过需要去到指定的商店才能打折,对于有车一族来说办理一张骑士卡还是很有帮助的,在app里面所指定的加油站加油的话,会有一些折扣和优惠。相信很多人看到了支付宝骑士卡的广告了吧,有些人看…

    2023年10月27日
    09
  • 淘花在哪里绑定支付宝。

    用淘花推广的伙伴,如果想及时的让佣金到账的,那么淘花就得和自己的支付宝绑定在一起,因为推广所得佣金是结算到支付宝上面的,那淘花绑定支付宝是在哪里绑定?假如你的支付宝号就是你的手机号的,那么在注册登录的…

    2023年10月27日
    02
  • PHP文件操作相关函数

    bool copy ( string filename , string dest ) 复制文件 string filename:原文件 string dest :目标文件 bool unlink ( string filename ) 删除文件 string filename:要删除的文件 bool rename ( string oldname…

    2017年11月15日
    0356

联系我们

QQ:951076433

在线咨询:点击这里给我发消息邮件:951076433@qq.com工作时间:周一至周五,9:30-18:30,节假日休息