精华内容
下载资源
问答
  • 基于thinkphp5框架 微信小程序或微信支付相关操作 支付 /** * 预支付请求接口(POST) ... * @param string $order_sn 订单编号 * @param string $total_fee 金额 * @return json的数据 */ public function.

    基于thinkphp5框架

    微信小程序或微信支付相关操作

    目录

    支付

    退款

    订单查询

    退款查询

    支付成功,进行回调

    退款成功 进行回调

    用到的方法


    支付

    /**
         * 预支付请求接口(POST)
         * @param string $openid openid
         * @param string $body 商品简单描述
         * @param string $order_sn 订单编号
         * @param string $total_fee 金额
         * @return  json的数据
         */
        public function prepay()
        {
            tp_log('预支付请求数据===>' . json_encode($_POST), 'prepay', request()->controller());
            $goods_user = db('tf_goods_user')->where(array('order_no' => $_POST['order_no']))->find();
            $goods = db('tf_goods')->where(array('id' => $goods_user['goods_id']))->find();
            //判断产品的数量
            if (($goods['sales_initial'] - $goods['sales_actual']) <= 0) {
                $return['status'] = 0;
                $return['info'] = '此产品已售完';
                exit(json_encode($return));
            }
    
            $order_no = $_POST['order_no']; //订单号
            $is_sale = $_POST['is_sale'];
            $openid = $_POST['openid'];
            $goods_name = $_POST['goods_name'];
            $pay_price = $_POST['price'];
            $attach['is_sale'] = $_POST['is_sale'];
            $attach['sale_id'] = $_POST['sale_id'];
            $nonce_str = $this->nonce_str();//随机字符串
    
    
            $order_no_ssh = $this->get_orderssh(); //商户订单号
    //注意 订单号为自己创建的订单 和支付没有任何关系 商户订单号是支付单号 用来支付的 每当订单号发起支付 就会有新的商户订单号 商户订单号是不重复的  发起一次支付就要生成新的商户订单号 要保存下来 订单表要有对应的支付订单表 而订单号与商户订单号是一对多的关系 订单表最终保存的商户订单号是支付成功的那个 也可以 没调起支付就根据订单号去修改订单表的商户订单号 只有商户订单号才能发起退款 相当于商户订单号统计记录到订单表里面 退款查询等操作  商户订单号  其实订单生成就不会改数据了 也可以用订单号改为商户订单号 这样支付 取消 在支付 也可以的
    
    (out_trade_no)
    
            //组装支付数据
            $data = [
                'appid' => config('pay.APPID'),
                'mch_id' => config('pay.MCHID'),
                'nonce_str' => $nonce_str,
                'body' => $goods_name,  //商品名称组合
                'attach' => json_encode($attach),
                'out_trade_no' => $order_no_ssh,//$order_no,        //订单号 商户订单号
                'total_fee' => intval($pay_price * 100),
                'spbill_create_ip' => $_SERVER['REMOTE_ADDR'],
                'notify_url' => config('pay.NOTIFY_URL'),
                'trade_type' => 'JSAPI',
                'openid' => $openid
            ];
    
            //订单支付表创建订单支付数据
            $p_o_data['createtime'] = time();
            $p_o_data['order_no'] = $order_no;
            $p_o_data['order_no_ssh'] = $order_no_ssh;
            $p_o_data['ready'] = json_encode($data);
            $p_o_return = db('tf_pay_order')->insert($p_o_data);
            if(!$p_o_return){
                //失败
                $return['status'] = -1;
                $return['info'] = $p_o_data;
                exit(json_encode($return));
            }
    
            // 获取签名
            $sign = $this->makeSign($data);
            $data['sign'] = $sign;
            $xml = $this->toXml($data);
            $url = 'https://api.mch.weixin.qq.com/pay/unifiedorder'; //发起支付接口链接
            //发起预支付请求
            $prepay_return_reslut_xml = $this->http_request($url, $xml);
            $xml_to_arr = $this->fromXml($prepay_return_reslut_xml);
            $return_result = json_encode($xml_to_arr, true);
            tp_log('预支付请求返回数据array===>' .$return_result , 'prepay', request()->controller());
            //记录预支付返回信息
            db('tf_goods_order')->where(array('order_no' => $order_no))
                ->update(array(
                    'go_pay' => $return_result,
                    'updatetime' => time(),
                    'updateuser' => $openid
                ));
            if($xml_to_arr['return_code'] == 'SUCCESS' && $xml_to_arr['result_code'] == 'SUCCESS'){
                //成功
    
                $time = time();
                //临时数组用于签名
                $tmp = [
                    'appId' => config('pay.APPID'),
                    'nonceStr' => $nonce_str,
                    'package' => 'prepay_id='.$xml_to_arr['prepay_id'],
                    'signType' => 'MD5',
                    'timeStamp' => "$time",
                ];
                $data['timeStamp'] = "$time";//时间戳
                $data['nonceStr'] = $nonce_str;//随机字符串
                $data['signType'] = 'MD5';//签名算法,暂支持 MD5
                $data['package'] = 'prepay_id='.$xml_to_arr['prepay_id'];//统一下单接口返回的 prepay_id 参数值,提交格式如:prepay_id=*
                $data['paySign'] = $this->makeSign($tmp);//签名,具体签名方案参见微信公众号支付帮助文档;$data['out_trade_no'] = $out_trade_no;
    
    
                $return['status'] = 1;
                $return['info'] = $data;
            }else{
                //失败
                $return['status'] = -1;
                $return['info'] = $xml_to_arr;
            }
            exit(json_encode($return));
        }
    
     //curl请求
        public function http_request($url, $data = null, $headers = array())
        {
            $curl = curl_init();
            if (count($headers) >= 1) {
                curl_setopt($curl, CURLOPT_HTTPHEADER, $headers);
            }
            curl_setopt($curl, CURLOPT_URL, $url);
    
    
            curl_setopt($curl, CURLOPT_SSL_VERIFYPEER, FALSE);
            curl_setopt($curl, CURLOPT_SSL_VERIFYHOST, FALSE);
    
    
            if (!empty($data)) {
                curl_setopt($curl, CURLOPT_POST, 1);
                curl_setopt($curl, CURLOPT_POSTFIELDS, $data);
            }
            curl_setopt($curl, CURLOPT_RETURNTRANSFER, 1);
            $output = curl_exec($curl);
            curl_close($curl);
            return $output;
        }
    

    退款

    /**
         * 申请退款API
         * @param $transaction_id
         * @param  double $total_fee 账单总金额
         * @param  double $refund_fee 退款金额
         * @return bool
         * @throws BaseException
         */
        public function refund()
        {
    
            $transaction_id = '4200000712202007274705432240';
            $total_fee = '0.01';
            $refund_fee = '0.01';
            // 当前时间
            $time = time();
            // 生成随机字符串
            $nonceStr = md5($time . $transaction_id . $total_fee . $refund_fee);
            // API参数
            $params = [
                'appid' => config('pay.APPID'),
                'mch_id' => config('pay.MCHID'),
                'nonce_str' => $nonceStr,
                'transaction_id' => $transaction_id,
                'out_refund_no' => $time,
                'total_fee' => $total_fee * 100,
                'refund_fee' => $refund_fee * 100,
                'notify_url' => config('pay.NOTIFY_URL_REFUND'),//退款回调地址
            ];
            // 生成签名
            $params['sign'] = $this->makeSign($params);
    
            tp_log('退款请求数据===>' . json_encode($params), 'refund', request()->controller());
    
            // 请求API
            $url = 'https://api.mch.weixin.qq.com/secapi/pay/refund';
            $result = $this->post($url, $this->toXml($params), true, $this->getCertPem());
            $prepay = $this->fromXml($result);
            // 请求失败
            if (empty($result)) {
                throw new BaseException(['msg' => '微信退款api请求失败']);
            }
            // 格式化返回结果
            $prepay = $this->fromXml($result);
            tp_log('退款返回数据===>' . json_encode($prepay), 'refund', request()->controller());
            // 请求失败
    //        if ($prepay['return_code'] === 'FAIL') {
    //            throw new BaseException(['msg' => 'return_msg: ' . $prepay['return_msg']]);
    //        }
    //        if ($prepay['result_code'] === 'FAIL') {
    //            throw new BaseException(['msg' => 'err_code_des: ' . $prepay['err_code_des']]);
    //        }
            return true;
        }
        /**
         * 模拟POST请求
         * @param $url
         * @param array $data
         * @param bool $useCert
         * @param array $sslCert
         * @return mixed
         */
        public function post($url, $data = [], $useCert = false, $sslCert = [])
        {
            $header = [
                'Content-type: application/json;'
            ];
            $curl = curl_init();
                    //如果有配置代理这里就设置代理
    //        if(WxPayConfig::CURL_PROXY_HOST != "0.0.0.0"
    //            && WxPayConfig::CURL_PROXY_PORT != 0){
    //            curl_setopt($ch,CURLOPT_PROXY, WxPayConfig::CURL_PROXY_HOST);
    //            curl_setopt($ch,CURLOPT_PROXYPORT, WxPayConfig::CURL_PROXY_PORT);
    //        }
    
            curl_setopt($curl, CURLOPT_URL, $url);
            curl_setopt($curl, CURLOPT_HTTPHEADER, $header);
            curl_setopt($curl, CURLOPT_HEADER, false);
            curl_setopt($curl, CURLOPT_RETURNTRANSFER, 1);
            curl_setopt($curl, CURLOPT_SSL_VERIFYPEER, false);
            curl_setopt($curl, CURLOPT_POST, TRUE);
            curl_setopt($curl, CURLOPT_POSTFIELDS, $data);
            if ($useCert == true) {
                // 设置证书:cert 与 key 分别属于两个.pem文件
                curl_setopt($curl, CURLOPT_SSLCERTTYPE, 'PEM');
                curl_setopt($curl, CURLOPT_SSLCERT, $sslCert['certPem']);
                curl_setopt($curl, CURLOPT_SSLKEYTYPE, 'PEM');
                curl_setopt($curl, CURLOPT_SSLKEY, $sslCert['keyPem']);
            }
            $result = curl_exec($curl);
            curl_close($curl);
            return $result;
        }
    

    订单查询

    /**
         * 订单查询
         * @param $out_trade_no
         * @return mixed
         * @throws BaseException
         */
        public function orderquery()
        {
             $transaction_id = '4200000712202007274705432240';//微信订单号
            // 当前时间
            $time = time();
            // 生成随机字符串
            $nonce_str = md5($time . mt_rand(00000,99999));
            //API参数
            $params = [
                'appid'        => config('pay.APPID'),             //公众号ID
                'mch_id'       => config('pay.MCHID'),  //商户号
                'transaction_id' => $transaction_id,            //商户订单号
                'nonce_str'    => $nonce_str,             // 随机字符串
            ];
            //生成签名
            $params['sign'] = $this->makeSign($params);
            //请求API
            $url = 'https://api.mch.weixin.qq.com/pay/orderquery';
            $result = $this->post($url, $this->toXml($params));
            $prepay = $this->fromXml($result);
            // 请求失败
            if ($prepay['return_code'] === 'FAIL') {
                throw new BaseException(['msg' => $prepay['return_msg'], 'code' => 0]);
            }
            if ($prepay['result_code'] === 'FAIL') {
                throw new BaseException(['msg' => $prepay['err_code_des'], 'code' => 0]);
            }
            return $prepay;
        }
    

    退款查询

    /**
         * 退款查询
         * @param $out_trade_no
         * @return mixed
         * @throws BaseException
         */
        public function refundquery()
        {
            $transaction_id = '4200000712202007274705432240';//微信订单号
            // 当前时间
            $time = time();
            // 生成随机字符串
            $nonce_str = md5($time . mt_rand(00000,99999));
            //API参数
            $params = [
                'appid'        => config('pay.APPID'),             //公众号ID
                'mch_id'       => config('pay.MCHID'),  //商户号
                'transaction_id' => $transaction_id,            //商户订单号
                'nonce_str'    => $nonce_str,             // 随机字符串
            ];
            //生成签名
            $params['sign'] = $this->makeSign($params);
            //请求API
            $url = 'https://api.mch.weixin.qq.com/pay/refundquery';
            $result = $this->post($url, $this->toXml($params));
            $prepay = $this->fromXml($result);
            dump($prepay);die;
            // 请求失败
            if ($prepay['return_code'] === 'FAIL') {
                throw new BaseException(['msg' => $prepay['return_msg'], 'code' => 0]);
            }
            if ($prepay['result_code'] === 'FAIL') {
                throw new BaseException(['msg' => $prepay['err_code_des'], 'code' => 0]);
            }
            return $prepay;
        }
    

    支付成功,进行回调

    public function index()
        {
            $data = file_get_contents('php://input');
            $data = $this->FromXml($data);
            tp_log('支付回调数据===>' . json_encode($data), 'index', request()->controller());
            // 保存微信服务器返回的签名sign
            $data_sign = $data['sign'];
            // sign不参与签名算法
            unset($data['sign']);
            $sign = $this->makeSign($data);//回调验证签名
    
            $str_success = '<xml><return_code><![CDATA[SUCCESS]]></return_code><return_msg><![CDATA[OK]]></return_msg></xml>';
            $str_error = '<xml><return_code><![CDATA[FAIL]]></return_code><return_msg><![CDATA[签名失败]]></return_msg></xml>';
    
            if (($sign === $data_sign) && ($data['return_code'] == 'SUCCESS') && ($data['result_code'] == 'SUCCESS')) {
           // 支付成功 进行你的逻辑处理
            }
    echo $str_success;//str_error  告知微信 你已的逻辑处理完毕 不用再推送或再次推送你结果
       }
    

    退款成功 进行回调

    /*
         * 小程序 退款结果通知
         */
        public function refund(){
    
            $data = file_get_contents('php://input');
            $data = $this->FromXml($data);
            tp_log('退款回调数据===>' . json_encode($data), 'refund', request()->controller());
    
            //对加密的字符串解密
            $req_info_xml = openssl_decrypt(base64_decode($data['req_info']), 'aes-256-ecb', md5(config('pay.KEY')),OPENSSL_RAW_DATA);
            $req_info = $this->FromXml($req_info_xml);
    
    //        // 保存微信服务器返回的签名sign
    //        $data_sign = $data['sign'];
    //        // sign不参与签名算法
    //        unset($data['sign']);
    //        $sign = $this->makeSign($data);//回调验证签名
    //
    //        $str_success = '<xml><return_code><![CDATA[SUCCESS]]></return_code><return_msg><![CDATA[OK]]></return_msg></xml>';
    //        $str_error = '<xml><return_code><![CDATA[FAIL]]></return_code><return_msg><![CDATA[签名失败]]></return_msg></xml>';
    //
    //
    //
    //        if (($sign === $data_sign) && ($data['return_code'] == 'SUCCESS') && ($data['result_code'] == 'SUCCESS')) {
    //            tp_log('退款成功===>', 'refund', request()->controller());
    //            //去修改订单的状态 和支付回调的一样 修改成功 告知微信 不在推送
    //        }
        }
    

    用到的方法

    /**
         * 生成签名
         * @param $values
         * @return string 本函数不覆盖sign成员变量,如要设置签名需要调用SetSign方法赋值
         */
        private function makeSign($values)
        {
            //签名步骤一:按字典序排序参数
            ksort($values);
            $string = $this->toUrlParams($values);
            //签名步骤二:在string后加入KEY
            $string = $string . '&key=' . config('pay.KEY');
            //签名步骤三:MD5加密
            $string = md5($string);
            //签名步骤四:所有字符转为大写
            $result = strtoupper($string);
            return $result;
        }
        private function ToUrlParams($array)
        {
            $buff = "";
            foreach ($array as $k => $v) {
                if ($k != "sign" && $v != "" && !is_array($v)) {
                    $buff .= $k . "=" . $v . "&";
                }
            }
            $buff = trim($buff, "&");
            return $buff;
        }
    
        /**
         * 输出xml字符
         * @param $values
         * @return bool|string
         */
        private function toXml($values)
        {
            if (!is_array($values)
                || count($values) <= 0
            ) {
                return false;
            }
            $xml = "<xml>";
            foreach ($values as $key => $val) {
                if (is_numeric($val)) {
                    $xml .= "<" . $key . ">" . $val . "</" . $key . ">";
                } else {
                    $xml .= "<" . $key . "><![CDATA[" . $val . "]]></" . $key . ">";
                }
            }
            $xml .= "</xml>";
            return $xml;
        }
    
        /**
         * 将xml转为array
         * @param $xml
         * @return mixed
         */
        private function fromXml($xml)
        {
            // 禁止引用外部xml实体
            libxml_disable_entity_loader(true);
            return json_decode(json_encode(simplexml_load_string($xml, 'SimpleXMLElement', LIBXML_NOCDATA)), true);
        }
    
        /**
         * 获取cert证书文件
         * @return array
         * @throws BaseException
         */
        private function getCertPem()
        {
    //        if (empty($this->config['cert_pem']) || empty($this->config['key_pem'])) {
    //            throw new BaseException(['msg' => '请先到后台小程序设置填写微信支付证书文件']);
    //        }
            // cert目录
            $filePath = EXTEND_PATH.'wxpay/cert/';
            return [
                'certPem' => $filePath . 'apiclient_cert.pem',
                'keyPem' => $filePath . 'apiclient_key.pem'
            ];
        }
    /**
         * 生成商户订单号
         */
        public function get_orderssh()
        {
            return date("YmdHis") . mt_rand(10000000, 99999999);
        }
    
    

    证书路径:

    在这里插入图片描述

    config配置

    在这里插入图片描述

     

    在这里插入图片描述

    展开全文
  • 支付宝sdk 支付订单查询失败

    千次阅读 2017-02-14 11:56:16
    最近遇到了一些问题,厂商给我们反馈了一个问题,就是支付宝支付成功之后,旋转屏幕,订单查询失败。后来我怀疑是支付宝的问题,想都不用想是支付宝的问题。 但是自己根本你无法复现,因为我发现支付宝支付完成之后...

    最近遇到了一些问题,厂商给我们反馈了一个问题,就是支付宝支付成功之后,旋转屏幕,订单查询失败。后来我怀疑是支付宝的问题,想都不用想是支付宝的问题。
    但是自己根本你无法复现,因为我发现支付宝支付完成之后根本无法旋转。

    后来我发现一个问题,就是他们的支付宝是全屏的,我的是半屏的。截图如下:
    全屏的:
    这里写图片描述

    半屏的:
    这里写图片描述

    后来产品告诉我,全屏的是支付宝wap支付,后来我才意识到问题:

    问题原因:

    问题是这样的:  如果手机上安装了支付宝,那么我们就会吊起支付宝支付,这时候屏幕方向是无法旋转的,如果手机上没有安装支付宝,
    
    那么就会走支付宝sdk支付,此时屏幕是可以旋转的,问题出在支付宝sdk,他们没有做屏幕旋转处理,所以,我们需要把屏幕方向固定
    

    所以,我们把支付宝sdk支付的activy设置成竖屏的:

    <activity
        android:name="com.alipay.sdk.app.H5PayActivity"
        android:configChanges="orientation|keyboardHidden|navigation"
        android:exported="false"
        android:process="@string/plug_process_name"
        android:screenOrientation="portrait" />
    <activity
        android:name="com.alipay.sdk.auth.AuthActivity"
        android:configChanges="orientation|keyboardHidden|navigation"
        android:exported="false"
        android:process="@string/plug_process_name"
        android:screenOrientation="portrait" />
    

    在AndroidManifest.xml 里面把这两个activity 的屏幕方向改为android:screenOrientation=“portrait”

    果然就是见得少,知道的少,出现问题没有办法知道出在哪里。都没用过支付宝sdk支付,所以,就根本没有意识到这个问题。

    展开全文
  • 当做支付测试时,去商户支付后台查询商户订单号时发现竟然一样, 深深摸索了好长时间… 原来是 微信支付后台服务器发生支付的时间 与 我们调用支付时发生的 时间 有几秒的误差,所以会导致生成的商户订单一致 ...

    当做支付测试时,去商户支付后台查询商户订单号时发现竟然不一样,
    深深摸索了好长时间…
    原来是 微信支付后台服务器发生支付的时间我们调用支付时发生的 时间 有几秒的误差,所以会导致生成的商户订单号不一致

    解决办法:
    去掉时间戳的秒

     $now = date("Y-m-d H:i");
     $time = strtotime($now);
    
    展开全文
  • php 微信 发红包,退款,订单查询项目实例
    //注意 需要修改 商户的openid 商户号 商户的支付密钥第222行 商户证书第326到330行 证书需要登陆微信商户后台下载然后放到对应的目录下面
    header("Content-type: text/html; charset=utf-8"); 
    //引用根目录的连接数据库文件
    $filename = dirname($_SERVER['DOCUMENT_ROOT']);
    require_once $filename."/fun/config.php";//链接数据库文件
    $db = new PDO($dsn, $user, $pwd);
    $db->exec("SET CHARACTER SET UTF8"); 
        /**
        * 现金红包接口
        * 2015-11-23
        *作者博客 http://blog.csdn.net/yao978318542
        * 
        * @return
        */
    
     $type=$_GET['type'];
    
    if($type==1){//红包
    $arr['openid']='888888888888';
                $arr['hbname']="提现申请";
                $arr['body']="您的提现申请已经成功";
                $arr['fee']=1;
    $comm = new Common_util_pub();          
    $re = $comm->sendhongbaoto($arr);
    var_dump($re);
    }
    if($type==4){//企业付款到零钱
    $arr['mch_id']=$py['mchid'];
            $arr['wxappid']=$py['appid'];
            $arr['openid']=$user['openid'];
            $arr['partner_trade_no']=get_order();//订单号
            $arr['fee']=1;
    $comm = new Common_util_pub();          
    $re = $comm->sendhongbaoto($arr);
    var_dump($re);
    }
    if($type==2){//退款
    //查询用户的OPENID
    
    
                    $res = $db->query("SELECT * FROM ai9me_sq_order WHERE order_sn = '".$_GET['ordesid']."'");
                    $order = $res->fetchall();
    
                    //print_r($result_arr);;die();
                    if($order[0]['id']){
                    //查询订单金额
                    $arr["out_trade_no"]=$order[0]["order_sn"];
                    $arr["out_refund_no"]=date('Ymd').substr(implode(NULL, array_map('ord', str_split(substr(uniqid(), 7, 13), 1))), 0, 8)."22";
                    $arr['total_fee']=$order[0]['price'];
                    $arr['refund_fee']=$_GET['tuiprice']; 
    
                    $comm = new Common_util_pub();          
                    $re = $comm->tuikuan($arr);
                    if($re['result_code']=='SUCCESS'){
                        mysql_query("UPDATE ai9me_sq_order SET tui_ordersid=".$arr["out_refund_no"].",tui_price=".$_GET['tuiprice']." ,tui_type ='2' WHERE  order_sn = '".$_GET['ordesid']."'");
                        echo "退款成功";
                        die();
                    }else{
                        echo $re['err_code_des'];die();
                        }
    
                    }else{
                        echo "订单号错误";die();
                        }
        }
    if($type==3){  
    $comm = new Common_util_pub();          
    $re = $comm->duizhang();
    var_dump($re); 
        }
    
    
    
    
    class Common_util_pub
    {
    
        /**
    * hbname 红包名称  fee 红包金额 /元  body 内容  openid 微信用户id
    * @param undefined $arr
    * 
    * @return
    */
    
    public function sendhongbaoto($arr){
    
    //$comm = new Common_util_pub();
    $data['mch_id'] = '88888888';
    $data['mch_billno'] = '88888888'.date("Ymd",time()).date("His",time()).rand(1111,9999);
    $data['nonce_str'] = self::createNoncestr();
    $data['re_openid'] = $arr['openid'];
    $data['wxappid'] = 'wxaf3aa765a46cf971';
    $data['nick_name'] = $arr['hbname'];
    $data['send_name'] = $arr['hbname'];
    $data['total_amount'] = $arr['fee']*100;
    $data['min_value'] = $arr['fee']*100;
    $data['max_value'] = $arr['fee']*100;
    $data['total_num'] = 1;
    $data['client_ip'] = '115.28.83.165';
    $data['act_name'] = '测试活动';
    $data['remark'] = '备注一下';
    $data['wishing'] = $arr['body'];
    if(!$data['re_openid']) {   
         $rearr['return_msg']='缺少用户openid';
         return $rearr;
    }
    $data['sign'] = self::getSign($data);//签名
    $xml = self::arrayToXml($data);
    
    $url ="https://api.mch.weixin.qq.com/mmpaymkttransfers/sendredpack";
    $re = self::wxHttpsRequestPem($xml,$url);
    $rearr = self::xmlToArray($re);
    
    
    return  $rearr;
    }
    
    public function qiye($arr){
    $comm = new Common_util_pub();
    $data['mch_appid'] = $arr['wxappid'];
    $data['mchid'] = $arr['mch_id'];
    $data['nonce_str'] = self::createNoncestr();
    $data["partner_trade_no"]=$arr['partner_trade_no'];
    $data['openid'] = $arr['openid'];
    $data['check_name'] ='NO_CHECK';
    $data['re_user_name']="暧昧永远都不是爱";
    $data['amount'] = $arr['fee']*100;
    $data['desc'] = '积分购买';
    $data['spbill_create_ip']='182.254.129.143';
    if(!$data['openid']) {   
         $rearr['return_msg']='缺少用户openid';
         return $rearr;
    }
    $data['sign'] = self::getSign($data);//签名
    $xml = self::arrayToXml($data);
    
    $url ="https://api.mch.weixin.qq.com/mmpaymkttransfers/promotion/transfers";
    $re = self::wxHttpsRequestPem($xml,$url);
    $rearr = self::xmlToArray($re);
    //print_r($data);
    // print_r($rearr);
    
    return  $rearr;
    }
    public function tuikuan($arr){
    
    $data['mch_id'] = '88888888';//s商户号id
    $data['nonce_str'] = self::createNoncestr();//随机字符串
    $data['appid'] = 'wxaf3aa765a46cf971';//公众号id
    $data['out_trade_no']=$arr['out_trade_no'];//订单号
    $data['out_refund_no']=$arr['out_refund_no'];//退款订单号
    $data['total_fee'] = $arr['total_fee']*100;//总金额单位为分
    $data['refund_fee'] = $arr['refund_fee']*100;//退款金额单位为分
    $data['op_user_id'] = 1218828001;//操作员账号默认为商户号
    $data['sign'] = self::getSign($data);//签名
    $xml = self::arrayToXml($data);
    
    $url ="https://api.mch.weixin.qq.com/secapi/pay/refund";
    $re = self::wxHttpsRequestPem($xml,$url);
    
    $rearr = self::xmlToArray($re);
    
    
    return  $rearr;
    
        }     
    public function duizhang(){
    
    $data['mch_id'] = '88888888';//s商户号id
    $data['nonce_str'] = self::createNoncestr();//随机字符串
    $data['appid'] = 'wx49b9da97a375b851';//公众号id
    $data['bill_type'] = "ALL";//账单类型ALL,返回当日所有订单信息,默认值
    $data['bill_date'] = 20151025;//打印那天的订单
    $data['sign'] = self::getSign($data);//签名
    
    $xml = self::arrayToXml($data);
    //print_r($xml);die();
    $url ="https://api.mch.weixin.qq.com/pay/downloadbill";
    $re = self::postXmlCurl($xml,$url);
    $rearr = self::xmlToArray($re);
    
    
    return  $rearr;
    
        }      
    
        function trimString($value)
        {
            $ret = null;
            if (null != $value) 
            {
                $ret = $value;
                if (strlen($ret) == 0) 
                {
                    $ret = null;
                }
            }
            return $ret;
        }
    
        /**
         *  作用:产生随机字符串,不长于32位
         */
        public function createNoncestr( $length = 32 ) 
        {
            $chars = "abcdefghijklmnopqrstuvwxyz0123456789";  
            $str ="";
            for ( $i = 0; $i < $length; $i++ )  {  
                $str.= substr($chars, mt_rand(0, strlen($chars)-1), 1);  
            }  
            return $str;
        }
    
        /**
         *  作用:格式化参数,签名过程需要使用
         */
        function formatBizQueryParaMap($paraMap, $urlencode)
        {
            $buff = "";
            ksort($paraMap);
            foreach ($paraMap as $k => $v)
            {
                if($urlencode)
                {
                   $v = urlencode($v);
                }
                //$buff .= strtolower($k) . "=" . $v . "&";
                $buff .= $k . "=" . $v . "&";
            }
            $reqPar;
            if (strlen($buff) > 0) 
            {
                $reqPar = substr($buff, 0, strlen($buff)-1);
            }
            return $reqPar;
        }
    
        /**
         *  作用:生成签名
         */
        public function getSign($Obj)
        {
    
           foreach ($Obj as $k => $v)
            {
                $Parameters[$k] = $v;
            }
    
            //签名步骤一:按字典序排序参数
            ksort($Parameters);
    
            $String = $this->formatBizQueryParaMap($Parameters, false);
    
            //echo '【string1】'.$String.'</br>';
            //签名步骤二:在string后加入KEY
            //$String = $String."&key=".WxPayConf_pub::KEY();
            //同创蓝天
            //$String = $String."&key=b9ed35e42a2f68a763eceea1a67a0f47";
            //云微客
            $String = $String."&key=hongzhoukeji20150408330681000294";
            //echo "【string2】".$String."</br>";die();
            //签名步骤三:MD5加密
            $String = md5($String);
            //echo "【string3】 ".$String."</br>";die();
            //签名步骤四:所有字符转为大写
            $result_ = strtoupper($String);
            //echo "【result】 ".$result_."</br>";die();
            return $result_;
        }
    
        /**
         *  作用:array转xml
         */
    public  function arrayToXml($arr)
        {
            $xml = "<xml>";
            foreach ($arr as $key=>$val)
            {
                 if (is_numeric($val))
                 {
                    $xml.="<".$key.">".$val."</".$key.">"; 
    
                 }
                 else
                    $xml.="<".$key."><![CDATA[".$val."]]></".$key.">";  
            }
            $xml.="</xml>";
            return $xml; 
        }
    
        /**
         *  作用:将xml转为array
    
         */
        public function xmlToArray($xml)
        {       
            //将XML转为array        
            $array_data = json_decode(json_encode(simplexml_load_string($xml, 'SimpleXMLElement', LIBXML_NOCDATA)), true);      
            return $array_data;
        }
    
    
    
    
         /**
         *  作用:以post方式提交xml到对应的接口url
         */
        public function postXmlCurl($xml,$url,$second=30)
        {       
            //初始化curl        
            $ch = curl_init();
            //设置超时
            curl_setopt($ch, CURLOP_TIMEOUT, $second);
            //这里设置代理,如果有的话
            //curl_setopt($ch,CURLOPT_PROXY, '8.8.8.8');
            //curl_setopt($ch,CURLOPT_PROXYPORT, 8080);
            curl_setopt($ch,CURLOPT_URL, $url);
            curl_setopt($ch,CURLOPT_SSL_VERIFYPEER,FALSE);
            curl_setopt($ch,CURLOPT_SSL_VERIFYHOST,FALSE);
            //设置header
            curl_setopt($ch, CURLOPT_HEADER, FALSE);
            //要求结果为字符串且输出到屏幕上
            curl_setopt($ch, CURLOPT_RETURNTRANSFER, TRUE);
            //post提交方式
            curl_setopt($ch, CURLOPT_POST, TRUE);
            curl_setopt($ch, CURLOPT_POSTFIELDS, $xml);
            //运行curl
            $data = curl_exec($ch);
            curl_close($ch);
            //返回结果
            if($data)
            {
                curl_close($ch);
                return $data;
            }
            else 
            { 
                $error = curl_errno($ch);
                echo "curl出错,错误码:$error"."<br>"; 
                echo "<a href='http://curl.haxx.se/libcurl/c/libcurl-errors.html'>错误原因查询</a></br>";
                curl_close($ch);
                return false;
            }
        }
    
         public function wxHttpsRequestPem( $vars,$url, $second=30,$aHeader=array()){
    
                    $ch = curl_init();
                    //超时时间
                    curl_setopt($ch,CURLOPT_TIMEOUT,$second);
                    curl_setopt($ch,CURLOPT_RETURNTRANSFER, 1);
                    //这里设置代理,如果有的话
                    //curl_setopt($ch,CURLOPT_PROXY, '10.206.30.98');
                    //curl_setopt($ch,CURLOPT_PROXYPORT, 8080);
                    curl_setopt($ch,CURLOPT_URL,$url);
                    curl_setopt($ch,CURLOPT_SSL_VERIFYPEER,false);
                    curl_setopt($ch,CURLOPT_SSL_VERIFYHOST,false);
    
                    //以下两种方式需选择一种
    
                    //第一种方法,cert 与 key 分别属于两个.pem文件
                    //默认格式为PEM,可以注释
                     curl_setopt($ch,CURLOPT_SSLCERTTYPE,'PEM');
            curl_setopt($ch,CURLOPT_SSLCERT, getcwd().'/zhuji/apiclient_cert.pem');
            //默认格式为PEM,可以注释
            curl_setopt($ch,CURLOPT_SSLKEYTYPE,'PEM');
            curl_setopt($ch,CURLOPT_SSLKEY, getcwd().'/zhuji/apiclient_key.pem');
            curl_setopt($ch,CURLOPT_CAINFO, getcwd().'/zhuji/rootca.pem'); 
    
                    //第二种方式,两个文件合成一个.pem文件
                    //curl_setopt($ch,CURLOPT_SSLCERT,getcwd().'/all.pem');
    
                    if( count($aHeader) >= 1 ){
                            curl_setopt($ch, CURLOPT_HTTPHEADER, $aHeader);
                    }
    
                    curl_setopt($ch,CURLOPT_POST, 1);
                    curl_setopt($ch,CURLOPT_POSTFIELDS,$vars);
                    $data = curl_exec($ch);
                    if($data){
                            curl_close($ch);
                            return $data;
                    }
                    else { 
                            $error = curl_errno($ch);
                            echo "call faild, errorCode:$error\n"; 
                            curl_close($ch);
                            return false;
                    }
            }
    
    
    
    
    
    
    
    }
    
    ?>
    展开全文
  • java后台实现支付宝支付接口、支付宝订单查询接口 前端为APP  最近项目APP需要接入微信、支付宝支付功能,在分配开发任务时,听说微信支付接口比支付宝支付接口要难实现,由于我开发经验不是那么丰富(现工作经验1...
  • QR二维码的生成 微信支付第三方平台 统一下单思路说明 微信支付二维码实现思路 支付查询流程 测试支付结果的演示 对接订单生成逻辑&生成支付单完成支付 付款成功后修改订单状态&支付单状态 ...
  • 微信支付支持支付、退款、转款。有时想对相关信息进行查询。了解相对应的进度。那么通过这些查询接口就可完成对应的事情。
  • 微信支付开发(5) 订单查询

    千次阅读 2016-01-16 11:31:28
    本文介绍微信支付订单查询功能的实现。...因为某一方技术的原因,可能导致商户在预期时间内都收不到最终支付通知,此时商户可以通过该API来查询订单的详细支付状态。 订单查询API的URL为: https://api.weixin.qq.
  • 公司最近要搞微信支付, 之前也没有做过, 但是搞过阿里云, 想来也不是很难. 在网上找了很多贴子, 在eclipse里做了5个测试工程, 没有测试成功, 后来下了微信SDK, 也做了个测试样例, 期间参考了: ...
  • 由于我开发经验不是那么丰富(现工作经验1年半)且未接触过支付接口开发,组里刚好又有支付接口的老司机,所以很自然把简单的支付宝接口开发任务交给了我,看来开发组的组长还是很好人的嘛.....,废话就多说了,...
  • 微信支付v2开发(5) 订单查询

    千次阅读 2014-10-21 11:04:33
    本文介绍微信支付订单查询功能的实现。...因为某一方技术的原因,可能导致商户在预期时间内都收不到最终支付通知,此时商户可以通过该API来查询订单的详细支付状态。 订单查询API的URL为: https://api.weixin.qq.
  • 微信小程序云开发微信支付使用云开发微信支付功能的前提统一下单查询订单申请退款常见问题总结: 使用云开发微信支付功能的前提 小程序主体为企业或者工商个体户 小程序完成了微信认证 小程序接入微信支付 微信...
  • 支付成功与否,可取值:success not_pay 是 transaction_id 微信交易号 微信系统中的交易流水号,可用于查询订单状态 是 time_end 交易付款时间 格式为2016-07-28 16:01:01 是 微信退款订单 ...
  • php 支付宝支付回调与查询订单

    千次阅读 2018-09-29 17:31:22
    //如果没有做过处理,根据订单号(out_trade_no)在商户网站的订单系统中查到该笔订单的详细,并执行商户的业务程序 //请务必判断请求时的total_amount与通知时获取的total_fee为一致的 //如果有做过处理,执行...
  • 问题描述:微信官方提供的示例中支付扫码页只有二维码图,支付成功后没有任何交互为了更好的用户体验希望扫码支付成功后自动跳转到支付成功页。 解决方案:通过setInterval定时ajax查询订单状态,如果...
  • ① 首先要调起微信支付 ,执行微信或者是支付宝支付上图中已经注释的查询该笔订单是不是真正的意义上的支付成功了,这个查询要放在服务中去查询也就是 调起的QueryPayResultServices②再看这个... ...
  • 1.alipay.trade.query(统一收单线下交易查询)这个接口有个大坑 如下图在交易未成功前 是得不到 trade_no的 ,如果当前只是到了获取都二维码 ---&gt;等待用户扫码支付 的这一步我们只有 out_trade_no 所以我...
  • 上篇文章中,讲解并且实现微信支付,既然微信下单成功了,那我们怎么知道用户有没有付款呢? 说这里,小编先要明确一下,我们主要的是针对开发一个支付的SDK。SDK通俗来讲,把我们所编写的一个项目可以打包成一个...
  • 商家的app或商城支持支付宝支付支付的方式是商家根据商品价格生成相应的付款二维码,用户扫码付款,同时商家需要查看支付订单状态,备货出货,当然还要支持退款。 准备测试环境 1、开通开发者服务 用自己的...
  • 小程序支付+回调+查询订单记录

    千次阅读 2020-04-28 20:32:57
    一丶查看官方开发文档,地址为: ...二丶回传前端发起支付的参数 /** *调用统一下单接口,并接受返回的结果 * @param openid 用户唯一标识(详情请看微信登录) * @param money 金额 * @param order...
  • 订单支付状态同步解决方法

    千次阅读 2017-03-25 19:08:00
    1.支付成功后再下订单2,下订单同步我们服务器上3.订单生成时,一旦生成支付宝订单就同步我们服务器里,就时给我们的后台下一个订单,当然这时支付宝里已经有一份同样的订单了, 支付宝会发个状态,支付中,支付成功,...
  • 问题:支付成功后有可能存在网络抖动的情况,导致支付网关收不到确认请求,一直发消息到本地,这样就导致积分重复增加 #####解决: 使用防重表。 ####二、支付成功订单状态没修改 #####解决: 支付成功后程序...
  • 首先呢,需要公司去注册微信平台上的东西,拿资质,拿配置信息才可以进行测试。 我们程序猿这里直接从代码开始,不管前面乱七八糟的程序。 下载好文档后把文档放在 exends 目录下 ![这里我改名为 wechatpay]...
  • 海淘里最爱英淘,为别的,因为运费便宜,
  • 我们在调试支付宝沙箱环境的时候,支护宝会有一个回调函数,也就是在支付成功之后,可以调用我们支付之后需要执行的相关方法,从而达到数据库的数据和我们的操作相统一。 首先我们先在本地将回调函数编写好~ 在...
  • 读超时,写超时- 数据写入成功,返回超时了,数据库已真实变更了这条数据;- 数据未写入,请求超时了,数据库未发生变更; 全幂等能,半幂等;服务的调用方和服务的提供方幂等键要保证一致,唯一性,并且不变性;...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 26,195
精华内容 10,478
关键字:

付款成功订单查不到