第三方支付-程序员宅基地

技术标签: PHP  

https://pay.weixin.qq.com/wiki/doc/api/app/app.php?chapter=9_1  【微信支付】APP支付开发者文档

https://doc.open.alipay.com/doc2/detail?treeId=59&articleId=103666&docType=1    服务器异步通知参数说明

https://doc.open.alipay.com/docs/doc.htm?spm=a219a.7629140.0.0.9cVrvO&treeId=204&articleId=105465&docType=1   App支付请求参数说明

stripe 支付 退款

第一步先到stripe 官网  https://stripe.com 注册一个账号

然后到  https://pan.baidu.com/s/1eRIVVGm  这个链接里面下载例子(这个文件里只包含支付demo和公共api接口包)

Api 接口地址 :https://stripe.com/docs/api  (这个地址可能在谷歌里面打开里面什么都没有,大家可以到火狐或者IE浏览器上看看),api地址里面包含各种有关支付、退款的例子。

退款:退款里面调用的文件在 https://pan.baidu.com/s/1eRIVVGm 这里面

/*
 * 退款测试
 */
public function refund(){
    require_once 'public/stripe-php-3.20.0/init.php';
    \Stripe\Stripe::setApiKey("sk_test_BQokikJOvBiI2HlWgH4olfQ2");

    $re = \Stripe\Refund::create(array(
        "charge" => "ch_18lF8dEm2C3rQ9STPtScvnth",
        "amount" => "50",
    ));
    echo "<pre>";
    var_dump($re);die;
}

 

支付宝 支付demo

支付宝官网demo地址:https://b.alipay.com/order/techService.htm

打开连接后在最下面有所有的demo

 

支付宝退款

    https://docs.open.alipay.com/api_1/alipay.trade.refund

微信退款

    /*
     * 订单退款
     */
    static function wx_tui($order_id,$order){
        // 引入微信api
        require_once "./api/wxpay/lib/WxPay.Api.php";
        $input = new \WxPayRefund();
        $input->SetTransaction_id($order_id);
        $input->SetTotal_fee(1);
        $input->SetRefund_fee(1);
        $input->SetOut_refund_no(\WxPayConfig::MCHID . date("YmdHis"));
        $input->SetOp_user_id(\WxPayConfig::MCHID);
        $result = \WxPayApi::refund($input);
//      var_dump($result);
//        F('wxrefund' . setName(), $result);
        // 更新退款信息
        if ($result['return_code'] == "SUCCESS")
        {
            $time = time();
            // 更新订单状态
            M("order")->where("order_id = {$order['order_id']}")
                ->save(array('refund_price'=>$order['total_price'],
                    'user_confirm_refund'=>1,
                    'refund_status_time'=>$time,
                    'refund_status'=>1,
                    'pay_status'=>6));
//            M("orders")->where(array("trade_no" => $trade))->save($saveData);
        }
    }

微信提现

  微信提现的前提需要开启    

S1D(TTGYO@T~$%_@%9)F8CS

   功能

    //微信提现
    public function wxtix(){
        $date['device_info'] = post("access_token");//微信支付分配的终端设备号
        $date['openid'] = post("openid");//商户appid下,某用户的openid
        $date['amount'] = post("money",1);//企业付款金额,单位为分
        $user_id = (int)post("user_id");
        ksort($date);
        $string = $this->ToUrlParams($date);
        $string = substr(md5('kaimi'.$string."kaimi"),8,16);
        $secret = post("secret",'');//加密字段
        if($string!=$secret){
            $this->showCode(-2, array());
        }
        $user_wallet = M("user_wallet")->where("user_id = {$user_id}")->find();
        if($user_wallet['wallet_money']<$date['amount']){
            $this->showCode(1, array(), '余额不足');
        }
        if(empty($date['device_info'])||empty($date['openid'])||empty($date['amount'])){
            $this->showCode(-1, array(), '参数缺少');
        }
        $date['partner_trade_no'] = "ti".time(). rand(10000, 99999);//商户订单号,需保持唯一性
        $date['amount'] = $date['amount'] * 100;
        $time = time();
        M("titrade_no")->add(array("user_id"=>$user_id,"type"=>2,"money"=>$date['amount']/100,"trade_no"=>$date['partner_trade_no'],"ctime"=>$time));
        $data = $this->wx_tixian($date);
        if($data['return_code']=='SUCCESS'||$data['result_code']=='SUCCESS'){
            M("user_wallet")->where("user_id = {$user_id}")->setDec("wallet_money",$date['amount']/100);
            $time = time();
            M("titrade_no")->where("trade_no = {$data['partner_trade_no']} and user_id = {$user_id}")->save(array('ti_time'=>$time,'status'=>1));
            $this->showCode(0, array(), '提现成功');
        }else{
            $this->showCode(1, array(), '提现失败');
        }
    }

    /**
     * @param $date
     * 生成签名
     */
    public function sign($date){
        //签名步骤一:按字典序排序参数
        ksort($date);
        $string = $this->ToUrlParams($date);
        //签名步骤二:在string后加入KEY
        $string = $string . "&key=".\WxPayConfig::KEY;
        //签名步骤三:MD5加密
        $string = md5($string);
        //签名步骤四:所有字符转为大写
        $result = strtoupper($string);
        return $result;
    }
    /**
     * 格式化参数格式化成url参数
     */
    public function ToUrlParams($date)
    {
        $buff = "";
        foreach ($date as $k => $v)
        {
            if($k != "sign" && $v != "" && !is_array($v)){
                $buff .= $k . "=" . $v . "&";
            }
        }

        $buff = trim($buff, "&");
        return $buff;
    }
    //生成XML
    function xml($arr){
        $str = "<xml>";
        foreach($arr as $k=>$v){
            $str .= "<{$k}>{$v}</{$k}>";
        }
        $str .= "</xml>";
        return $str;
    }
    /*
     * 微信提现
     */
    public function wx_tixian($data){
        header("Content-type: text/html; charset=utf-8");

        // 引入微信api
        require_once "./api/wxpay/lib/WxPay.Api.php";
        $date['mch_appid'] = \WxPayConfig::APPID;//微信分配的公众账号ID(企业号corpid即为此appId)
        $date['mchid'] = \WxPayConfig::MCHID;    //微信支付分配的商户号
        $date['nonce_str'] = 'kaimi' .time(). rand(10000, 99999); //随机字符串,不长于32位
        $date['partner_trade_no'] = "ti".time(). rand(10000, 99999);//商户订单号,需保持唯一性
        /**
         * NO_CHECK:不校验真实姓名
         *FORCE_CHECK:强校验真实姓名(未实名认证的用户会校验失败,无法转账)
         *OPTION_CHECK:针对已实名认证的用户才校验真实姓名(未实名认证用户不校验,可以转账成功)
         */
        $date['check_name'] = "NO_CHECK";
        $date['re_user_name']  = ""; //收款用户真实姓名。  如果check_name设置为FORCE_CHECK或OPTION_CHECK,则必填用户真实姓名
        $date['desc'] = "提现"; //企业付款操作说明信息。必填。
        $date['spbill_create_ip'] = $_SERVER["REMOTE_ADDR"]; //调用接口的机器Ip地址
        $date['sign'] = $this->sign($date);                //签名
        $data = $this->xml($date);
        $ch = curl_init();
        $MENU_URL = "https://api.mch.weixin.qq.com/mmpaymkttransfers/promotion/transfers";
        curl_setopt($ch, CURLOPT_URL, $MENU_URL);
        curl_setopt($ch, CURLOPT_CUSTOMREQUEST, "POST");
        curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, FALSE);
        curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, FALSE);

        $zs1 = \WxPayConfig::getSSLcertPath();
        $zs2 = \WxPayConfig::getSSLKeyPath();
        curl_setopt($ch, CURLOPT_SSLCERT, $zs1);
        curl_setopt($ch, CURLOPT_SSLKEY, $zs2);
// curl_setopt($ch, CURLOPT_USERAGENT, 'Mozilla/5.0 (compatible; MSIE 5.01;
// Windows NT 5.0)');
        curl_setopt($ch, CURLOPT_FOLLOWLOCATION, 1);
        curl_setopt($ch, CURLOPT_AUTOREFERER, 1);
        curl_setopt($ch, CURLOPT_POSTFIELDS, $data);
        curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);

        $info = curl_exec($ch);

        if (curl_errno($ch)) {
            echo 'Errno' . curl_error($ch);
        }
        curl_close($ch);
        $data = \WxPayResults::Init($info);
        return $data;
    }

微信官网接口地址:https://pay.weixin.qq.com/wiki/doc/api/tools/mch_pay.php?chapter=14_2

微信支付

/**
     *  帮我买下单  微信支付
     */
    public function weipay(){
        $order_id = I("order_id");
        $money = I("money");
        if($order_id == '' || $money == ''){
            $this->json("100090","缺少参数");
        }
        require_once "./public/weipay/lib/WxPay.Api.php";
        require_once "./public/weipay/example/log.php";
        require_once "./public/weipay/lib/WxPay.Config.php";
        $ordrTitle = "电达人订单支付";
        // 准备参数
        $notify_url = $_SERVER['HTTP_HOST']."/index.php/api/orders/order_callback_weipay";
        // 统一下单
        $input = new \WxPayUnifiedOrder();
        $input->SetBody($ordrTitle);
        $input->SetAttach($ordrTitle);
        $input->SetOut_trade_no($order_id);
        $input->SetTotal_fee($money * 100);
        $input->SetTime_start(date("YmdHis"));
        $input->SetNotify_url($notify_url);
        $input->SetTrade_type("APP");
        $input->SetSpbill_create_ip($_SERVER['REMOTE_ADDR']);//终端ip
        $order = \WxPayApi::unifiedOrder($input);
        //dump($order);die;
        if ($order['return_code'] == 'SUCCESS')
        {
            $wxvalue = array();
            $wxvalue['appid'] = $order['appid'];
            $wxvalue['prepayid'] = $order['prepay_id'];
            $wxvalue['partnerid'] = $order['mch_id'];
            $wxvalue['package'] = 'Sign=WXPay';
            $wxvalue['timestamp'] = time();
            $wxvalue['noncestr'] = \WxPayApi::getNonceStr();
            ksort($wxvalue); // 排序
            $wxstr = $this->ToUrlParams($wxvalue);
            $string = $wxstr . "&key=" . \WxPayConfig::KEY;
            // 签名步骤三:MD5加密
            $md5string = md5($string);
            $wxvalue['sign'] = strtoupper($md5string);
            $wxvalue['title'] = $ordrTitle;
            $new = $wxvalue;
            $new['order_id'] = $order_id;
            //dump($new);die;
            $this->json('10001',$new);
            // json("10001", $wxvalue);

        }else{
            $this->json('405', '支付生成失败,请联系我们');
        }
    }

/**
     * 微信支付回调
     */
    public function order_callback_weipay(){
        $arr = $_POST;
        if (empty($arr))
        {
            $xml = file_get_contents('php://input');
            $arr = $this->FromXml($xml);
        }
        if (array_key_exists('openid', $arr))
        {
            if($arr['result_code']=="SUCCESS"){
                $orderid = $arr['out_trade_no'];
                $stas = M("order")->where("order_id='$orderid'")->field("statics")->find();
                $static = $stas["statics"];
                if($static == 2){
                    $da["statics"] = 3;
                    $da["is_zhi"] = 1;
                } else {
                    $da["statics"] = 9;
                    $da["is_zhi"] = 2;
                }
                M("order")->where("order_id = {$arr['out_trade_no']}")->save($da);
            }
            //$info = json_decode($arr,true);
            //    M("weixin")->add($arr);
            //echo '<xml><return_code>SUCCESS</return_code><return_msg>OK</return_msg></xml>';
            echo "<xml><return_code><![CDATA[SUCCESS]]></return_code><return_msg><![CDATA[OK]]></return_msg></xml>";
        }
    }

    /**
     * 拼接key=>$value
     * @access public
     */
    protected function ToUrlParams ($wxarr)
    {
        $buff = "";
        foreach ($wxarr as $k => $v)
        {
            if ($k != "sign" && $v != "" && ! is_array($v))
            {
                $buff .= $k . "=" . $v . "&";
            }
        }

        $buff = trim($buff, "&");
        return $buff;
    }

    /**
     * xml数据转array
     * @param unknown $xml
     * @throws WxPayException
     * @return mixed
     */
    protected function FromXml ($xml)
    {
        if (! $xml)
        {
            return;
        }
        // 将XML转为array
        // 禁止引用外部xml实体
        libxml_disable_entity_loader(true);
        $data = json_decode(json_encode(simplexml_load_string($xml, 'SimpleXMLElement', LIBXML_NOCDATA)), true);
        return $data;
    }

微信官网demo地址 https://pay.weixin.qq.com/wiki/doc/api/jsapi.php?chapter=11_1

支付宝支付

//支付宝
require_once "./public/alipay/lib/alipay_core.function.php";
require_once "./public/alipay/lib/alipay_rsa.function.php";

$data['notify_url'] = "http://".$_SERVER['HTTP_HOST'].'/index.php/Api/Orders/order_callback_alipay1';
$data['app_id'] = '2016112203112986';//Appid

$data['method'] = 'alipay.trade.app.pay';
$data['charset'] = 'utf-8';
$data['sign_type'] = 'RSA';
$data['timestamp'] = date("Y-m-d H:i:s");
$data['version'] = '1.0';
$data['timeout_express'] = '30m';
$data['biz_content'] = "{'seller_id':'2088521328498118','total_amount':$money,'subject':'电达人订单支付','body':'电达人','out_trade_no':'".$sheng_order."','product_code':'QUICK_MSECURITY_PAY'}";

$mygoods = argSort($data);
//拼接
$mystr = createLinkstring($mygoods);
//签名
$p = 'MIICXQIBAAKBgQDIQlDqpQXj1I2fNvGV5jEoslU2JXLhp8F0/ST9r07dip6cUBhD
03hfgm0kUZRzhTazRhK1HctvgIfBQ3aK2qKtYnSsBmXeqn5Om4CXdacbhLo17Iw+
z86i9xTo9htlWEmoSUjB49bFuZ29EW7UFO387LGHryW2WGNieI2+MrNVVwIDAQAB
AoGAKoaSolFq38e6T04enUNluwurtrTbIXo7RbmgClMY/0i5h94mWPjmPfn3bVf5
m1J1nDpMLLPoCISVz3+hA7mMA79xgL+PAvLmWnkPYHIo6rucG5BFhPLQo5z+w8J+
+e4Ri9e/I6yEOfUWAQnr74T1qmGxRihDcMHu07BE4f2EWKECQQDuq/odOY5onwSt
I7g0ojEz/0wz9X7nGIyUqmK+JwFchQARqOQQoAY1ngiCgY1co9HRmU7PdbLTi0Z8
ExNDlsgxAkEA1sxjh5Mq75ryA9BYWvL7fIM6k9Wn3GT1aMrJ41yppMVECLMi8Mat
r3KwT3vYku0x58La1G/2eFydIlfvAXacBwJBAOMDsWMa29mnZ0tILm3h1+sdad4C
JDKrpwvBBSrY7vKRjv89JbCqhT16k52OnGcBaxFyQQQTb4THdMOPYUNoqAECQAYN
tpRgkmo0TLPM0GCnzmyg6iq2b8enVL9CT9RHjURmhtdT7R0qDEUQj2V+EQl7A9gL
Rs2L5j9YJNmN7t90r0sCQQDECDHvrl6eSZMF1ZrLbGT9XdsfAkGuMt3yHVu8FU5/
fVEjJCF3e56F1qS6Hj41Kr371FhAXTW5uroAGEa07n4Z'; //
$sign = rsaSign($mystr,$p);
//对签名进行urlencode转码
$sign = urlencode($sign);
$data1['sign'] = $sign;

$orderInfor = $mystr."&sign=".$sign;
$this->json('10001',$orderInfor);

/*

*支付宝支付 回调函数

*/

if (array_key_exists('buyer_id', $arr))      //支付宝  回调函数
{
    require_once "./public/alipay/alipay.config.php";
    require_once "./public/alipay/lib/alipay_notify.class.php";
    require_once "./public/alipay/lib/alipay_rsa.function.php";
    require_once "./public/alipay/lib/alipay_core.function.php";
    //计算得出通知验证结果
    $alipayNotify = new \AlipayNotify($alipay_config);
    if($alipayNotify->getResponse($_POST['notify_id'])) {  //判断成功之后使用getResponse方法判断是否是支付宝发来的异步通知。
        if($alipayNotify->getSignVeryfy($_POST, $_POST['sign'])) {  //使用支付宝公钥验签
            if($_POST['trade_status'] == 'TRADE_FINISHED') {
            }
            if ($_POST['trade_status'] == 'TRADE_SUCCESS') {
                $da2["ding"] = $arr['total_amount']; //total_fee
                $da2["is_zhi"] = 1;//支付状态 支付定金
                $da2["statics"] = 3;//订单状态 支付定金
                $da2["zhi_type"] = 2;//支付方式 支付定金 2 支付宝
                $order_id = $arr['out_trade_no'];
                M("order")->where("ding_order ='$order_id'")->save($da2);
//                        $d = M("order")->getLastSql();
//                        $arr['c_name'] = $d;
//                        M("ceshi")->add($arr);
                $d = json_encode($arr);
                $ard['c_name'] = $d;
                M("ceshi")->add($ard);
            }
            M("zhifubao")->add($arr);
            echo "success";        //请不要修改或删除
        }else //验证签名失败
        {
//                    $arr['c_name'] = '4';
//                    M("ceshi")->add($arr);
//                    logResult('验证签名失败11');
            echo "sign fail";
        }
    }else //验证是否来自支付宝的通知失败
    {
//                $arr['c_name'] = '2';
//                M("ceshi")->add($arr);
        //    logResult('验证失败22');
        echo "response fail";
    }
}

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/qq_36336700/article/details/84568191

智能推荐

我们应如何度过自己的大学生活?_如何度过大学生活1000字-程序员宅基地

文章浏览阅读3.1k次。我们应如何度过自己的大学生活?  踏着九月的烈日,我们成功地来到了河南理工大学,开始了我们的大学生活,那么你可曾想过,我们到底应该如何度过我们的大学生活才算有意义呢?  可曾记得高中老师说的最多的一句话:“好好学吧!上了大学就轻松了!”每当听到这句话时都会给我们莫大的鼓励,也让我们对大学充满了憧憬。那么大学生活真如高中老师说的那样轻松吗?其实不然!高中老师所谓的轻松只是在一定程度上正课的时..._如何度过大学生活1000字

python snownlp情感分析简易demo(分享),没有我Python干不成的事!_snowlp情感分析代码-程序员宅基地

文章浏览阅读745次。SnowNLP是国人开发的python类库,可以方便的处理中文文本内容,是受到了TextBlob的启发而写的,由于现在大部分的自然语言处理库基本都是针对英文的,于是写了一个方便处理中文的类库,并且和TextBlob不同的是,这里没有用NLTK,所有的算法都是自己实现的,并且自带了一些训练好的字典。注意本程序都是处理的unicode编码,所以使用时请自行decode成unicode。MIT许可下发行。其github主页可能有些不准确,我也是随便提取的数据,不过snownlp还是号称情感分析准确很高的!_snowlp情感分析代码

命令行安装todesk_todesk命令行csdn-程序员宅基地

文章浏览阅读653次,点赞10次,收藏7次。要想通过命令行安装todesk,也是比较简单的。_todesk命令行csdn

如何开发一个个人微信小程序,微信小程序开发入门教程_微信小程序怎么开发自己的小程序-程序员宅基地

文章浏览阅读10w+次,点赞183次,收藏1.1k次。做任何程序开发要首先找到其官方文档,我们先来看看其有哪些官方文档。微信小程序开发文档链接为:https://mp.weixin.qq.com/debug/wxadoc/dev/index.html,如下图:这里就是做微信小程序开发的全部官方文档。知道了文档的位置,下面我们来介绍下如何做一个微信小程序开发:第一步:下载微信小程序开发者工具并安装,下载路径:https://mp.weix..._微信小程序怎么开发自己的小程序

前端解决浏览器直接打开图片URL,下载问题_前端想要通过url下载但是打开了网页-程序员宅基地

文章浏览阅读1w次,点赞3次,收藏7次。本周做的项目中有一个下载图片的功能,拿到后台返回的url,像文件一样,直接window.open,发现图片没有像文件一样被下载,而是重新打开了一个页面展示图片。然后我尝试了转成base64等方法也还是有跨域的问题。后来就想着自己把这个url,发送给Node,node转成数据流返回给我,我再下载。话不多说,上代码:vue前端代码: downZip (urls) { ..._前端想要通过url下载但是打开了网页

什么是内部类?成员内部类、静态内部类、局部内部类和匿名内部类的区别及作用?_成员内部类和局部内部类的区别-程序员宅基地

文章浏览阅读3.4k次,点赞8次,收藏42次。一、什么是内部类?or 内部类的概念内部类是定义在另一个类中的类;下面类TestB是类TestA的内部类。即内部类对象引用了实例化该内部对象的外围类对象。public class TestA{ class TestB {}}二、 为什么需要内部类?or 内部类有什么作用?1、 内部类方法可以访问该类定义所在的作用域中的数据,包括私有数据。2、内部类可以对同一个包中的其他类隐藏起来。3、 当想要定义一个回调函数且不想编写大量代码时,使用匿名内部类比较便捷。三、 内部类的分类成员内部_成员内部类和局部内部类的区别

随便推点

语义分割入门的总结-程序员宅基地

文章浏览阅读740次。点击上方“小白学视觉”,选择加"星标"或“置顶”重磅干货,第一时间送达作者:Yanpeng Sunhttps://zhuanlan.zhihu.com/p/74318967声明:仅做学术分..._语义分割两个目标重合怎么

SpringBoot实践(三十五):JVM信息分析_怎样查看springboot项目的jvm状态-程序员宅基地

文章浏览阅读902次。JVM分析可以也可以使用,那么什么时候用到jvm信息分析呢,一般生产测试环境,能够最大化将问题暴露,但是总有些问题只有生产运行很长时间后才会被发现,jvm分析经常用于运行了很久的系统有异常情况时的调优,比如堆内存本身分配不合理,新生代中eden比例太低等。_怎样查看springboot项目的jvm状态

基于springboot+vue的戒毒所人员管理系统 毕业设计-附源码251514_戒毒所管理系统-程序员宅基地

文章浏览阅读288次。戒毒所人员管理系统的开发是采用java语言,基于MVVM模式进行开发,采取MySQL作为后台数据的主要存储单元,采用Springboot框架实现了本系统的全部功能。戒毒所人员管理系统,具有戒毒人员管理、尿检管理、戒毒管理、治疗分类、社会跟踪等功能,本系统代码的复用率高,系统维护代价小,具有方便、灵活、高效等特征。_戒毒所管理系统

【LeetCode】面试题57 - II. 和为s的连续正数序列_leet code 和为s的正数序列 java-程序员宅基地

文章浏览阅读174次。来源:力扣(LeetCode)链接:https://leetcode-cn.com/problems/he-wei-sde-lian-xu-zheng-shu-xu-lie-lcof题目描述:输入一个正整数 target ,输出所有和为 target 的连续正整数序列(至少含有两个数)。序列内的数字由小到大排列,不同序列按照首个数字从小到大排列。示例 1:输入:target = 9..._leet code 和为s的正数序列 java

java spark的使用和配置_使用java调用spark注册进去的程序-程序员宅基地

文章浏览阅读3.3k次。前言spark在java使用比较少,多是scala的用法,我这里介绍一下我在项目中使用的代码配置详细算法的使用请点击我主页列表查看版本jar版本说明spark3.0.1scala2.12这个版本注意和spark版本对应,只是为了引jar包springboot版本2.3.2.RELEASEmaven<!-- spark --> <dependency> <gro_使用java调用spark注册进去的程序

汽车零部件开发工具巨头V公司全套bootloader中UDS协议栈源代码,自己完成底层外设驱动开发后,集成即可使用_uds协议栈 源代码-程序员宅基地

文章浏览阅读4.8k次。汽车零部件开发工具巨头V公司全套bootloader中UDS协议栈源代码,自己完成底层外设驱动开发后,集成即可使用,代码精简高效,大厂出品有量产保证。:139800617636213023darcy169_uds协议栈 源代码