精华内容
下载资源
问答
  • 付款成功订单查不到
    2020-10-23 14:07:11

    一、概述

    本系列博客将讨论基于微信支付的项目开发中,涉及到的下单与支付、退款、以及订单查询的后端代码实现。在本系列博客中,将以代码片段作为示例,来讨论ThinkPHP 后端接口实现的过程。

    在本系列的接口示例中,返回的状态码标识如下:

    0: 业务成功
    -1: 业务失败
    

    开发环境如果:

    • ThinkPHP 6 或者 ThinkPHP 5 / 5.1
    • PHP 7 运行环境

    本文是第三篇,我们先讨论订单查询。

    订单查询接口是用于查询订单状态的,当用户支付成功之后,或者退款成功之后,微信服务器可能没有及时完成通知(这种概率很小)。我们可以设置订单查询接口给前段调用来更新业务的订单状态,及时完成订单状态的更新。

    二、请求查询接口

    //根据客户端传过来的业务订单id,获取到业务订单对象
    $order = Orders::where('id',request()->params('id'))->find();
    if (!$order) {
        return json(['code':-1,'msg':'订单不存在']);
    }
    //构造请求微信接口的参数
    $params = [
        'appid' => config('wx.app_id'),// APP ID
        'mch_id' => config('wx.mch_id'),// 商户号
        'out_trade_no' => $order['out_trade_no'],
        'nonce_str' => md5(time()),
        'sign_type' => 'MD5',
    ];
    //构造xml
    $xml = '<?xml version="1.0" encoding="utf-8"?>';
    $xml .= '<xml>';
    $stringA = '';
    ksort($params);
    foreach ($params as $key => $value) {
        $stringA .= $key . '=' . $value . '&';
        $xml .= '<' . $key . '>' . $value . '</' . $key . '>';
    }
    $signTmp = $stringA . 'key=' . config('wx.mch_key');//拼接商户号
    $sign = strtoupper(md5($signTmp));//签名后的32位字符
    //将签名添加到xml中
    $xml .= '<sign>' . $sign . '</sign>';
    $xml .= '</xml>';
    

    构造好参数之后,发送请求

    //发起https请求
    $url = 'https://api.mch.weixin.qq.com/pay/orderquery';
    $res_xml = order_request($url, $xml);
    $simpleXMLElement = simplexml_load_string($res_xml, 'SimpleXMLElement', LIBXML_NOCDATA);
    //将SimpleXMLElement对象转为数组
    $jsonStr = json_encode($simpleXMLElement);
    $jsonArray = json_decode($jsonStr, true);
    

    如果订单已经支付,更新为已支付状态,如果订单已退款,更新为退款状态

    //更新订单状态
    if (strval($jsonArray['return_code']) === 'SUCCESS') {
        if (strval($jsonArray['trade_state']) === 'SUCCESS') {
            if ($order['status'] !== 1) {
                // 支付成功
                $order['status'] = 1;
                $order['transaction_id'] = $jsonArray['transaction_id'];
            }
        } elseif (strval($jsonArray['trade_state']) === 'REFUND') {
            if ($order['status'] !== 3) {
                // 退款成功
                $order['status'] = 3;
                $order['transaction_id'] = $jsonArray['transaction_id'];
            }
        }
        $order->save();
    }
    
    更多相关内容
  • 基于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配置

    在这里插入图片描述

     

    在这里插入图片描述

    展开全文
  • PHP 之建行龙支付 - 被扫单(商家扫码客户二维码),查询订单是否付款成功

    完整建行支付
    建行主扫支付:https://blog.csdn.net/weixin_42674576/article/details/122010126?spm=1001.2014.3001.5501
    建行被扫支付:https://blog.csdn.net/weixin_42674576/article/details/122380110?spm=1001.2014.3001.5501
    退款:https://blog.csdn.net/weixin_42674576/article/details/122428305

    <?php
    namespace service\ccb;
    use app\util\HttpUtil;
    
    class QueryService
    {
        // 请求接口域名
        const HOST = 'https://ibsbjstar.ccb.com.cn/CCBIS/B2CMainPlat_00_BEPAY';
        const MD5KEY = '20120315201809041004';
    
        /**
         * 支付查询 轮询订单结果-PAY101
         */
        public function query($input) {
            $param = config('ccb.bePay');
    
            $publicParam = config('ccb.public');
    
            $data = [
                'MERCHANTID'   => $publicParam['merchant_id'],  // 商户号
                'POSID'        => $publicParam['pos_id'],       // 柜台号
                'BRANCHID'     => $publicParam['branch_id'],    // 分行号
                'GROUPMCH'     => '',                           // 集团商户信息
                'TXCODE'       => 'PAY101',                     // 交易码
                'MERFLAG'      => $param['mer_flag'],           // 商户类型
                'TERMNO1'      => '',                           // 终端编号 1
                'TERMNO2'      => '',                           // 终端编号 2
                'ORDERID'      => $input['order'],              // 订单号
                'QRYTIME'      => $input['qr_time'],            // 查询次数 从1开始
                'QRCODE'       => isset($input['code']) ? $input['code'] : '',            // 码信息(一维码、二维码)
                'QRCODETYPE'   => isset($input['code_type']) ? $input['code_type'] : '',  //二维码类型 如QRCODE为空 此参数为必输,1:龙支付2:微信3:支付宝4:银联
                'REMARK1'      => '',    // 备注 1
                'REMARK2'      => '',    // 备注 2
                'SUB_APPID'    => '',    // 子商户公众账号 ID
                'RETURN_FIELD' => '',    // 返回信息位图
            ];
    
            // 与支付的区别TXCODE不一样,需要传QRYTIME,QRCODE和QRCODETYPE两个需传一个
            // 后续计算签名和加密串跟支付类似
            // 计算签名
            $sign = $this->calSign($this->sortParams($data));
    
            $data['SIGN'] = $sign;
    
            // 计算加密串
            $params = http_build_query($data);
    
            $pubKey = substr($publicParam['pub_key'], -30);
    
            $pubKey = substr($pubKey, 0, 8);
    
            $data['ccbParam'] = $this->calCcbParam($params, $pubKey);
    
            // 获取要请求的参数
            $requestData = $this->getRequestData($data);
    
            $url = self::HOST . '?' . http_build_query($requestData);
    
            $httpRequest = new HttpUtil();
    
            $res = $httpRequest::post($url);
    
            return $res;
        }
    
    
        /**
         * 按key升序排序,同时去掉空值
         * @param $params array
         * @return mixed
         */
        public function sortParams($params) {
            ksort($params);
            foreach ($params as $key => $value) {
                if (empty($value) && $value == '') {
                    unset($params[$key]);
                }
            }
            return $params;
        }
    
        /**
         * 计算签名
         * @param $params array 不含空值
         * @return string
         */
        public function calSign($params) {
            return md5(http_build_query($params) . self::MD5KEY);
        }
    
        /**
         * 真正请求建行接口要传的参数
         * @param $data array
         * @return array
         */
        public function getRequestData($data) {
            return [
                'MERCHANTID' => $data['MERCHANTID'],
                'POSID'      => $data['POSID'],
                'BRANCHID'   => $data['BRANCHID'],
                'ccbParam'   => $data['ccbParam'],
            ];
        }
    
        /**
         * 计算ccbparam
         * @param $params string
         * @param $key string
         * @return string
         */
        public function calCcbParam($params, $key) {
            $res = openssl_encrypt (iconv("utf-8", "utf-16", $params), 'DES-ECB', $key);
            $res = str_replace('+', ',', $res);
            $res = urlencode($res);
            return $res;
        }
    }
    

    完成后,在$input中传入参数:
    order:订单号
    code:码信息(扫码得到的字符串)
    code_type:二维码类型 如未上送 QRCODE 则此参数为必输,1:龙支付2:微信3:支付宝4:银联
    qr_time:查询次数,从1开始,每次+1,最高6次

    被扫支付成功后,查询订单状态,接口返回如下:
    在这里插入图片描述
    还有一种方式是在建行商户平台去设置支付回调地址,然后服务器接收数据,再做验签

    展开全文
  • 公司最近要搞微信支付, 之前也没有做过, 但是搞过阿里云, 想来也不是很难. 在网上找了很多贴子, 在eclipse里做了5个测试工程, 没有测试成功, 后来下了微信SDK, 也做了个测试样例, 期间参考了: ...

    公司最近要搞微信支付, 之前也没有做过, 但是搞过阿里云, 想来也不是很难. 在网上找了很多贴子, 在eclipse里做了5个测试工程, 没有测试成功, 后来下了微信SDK, 也做了个测试样例, 期间参考了: https://blog.csdn.net/t_james/article/details/84653827#comments

    第一步, 下SDK,  https://pay.weixin.qq.com/wiki/doc/api/app/app.php?chapter=11_1

    第二步, 准备 公众号appid, 商业号(MchID),  key,  参考: https://pay.weixin.qq.com/wiki/doc/api/micropay.php?chapter=3_1 获得,

    这个是需要公司去注册与申请的, 

    第三步, 开通支付模式, 这里要是扫码支付(Native支付), 支付模式介绍见: https://pay.weixin.qq.com/wiki/doc/api/native.php?chapter=2_1

    第四步, 把工程导入eclipse, 完整如下图:

     

    以下是完整代码, 搞多了大家不理解, 就一个类:

    package com.github.wxpay.test;
    
    import java.util.Map;
    import java.util.SortedMap;
    import java.util.TreeMap;
    
    import com.github.wxpay.sdk.WXPay;
    import com.github.wxpay.sdk.WXPayUtil;
    import com.github.wxpay.sdk.WxPayConfigImpl;
    
    /**
     * 签名验证工具地址:
     * https://pay.weixin.qq.com/wiki/doc/api/app/app.php?chapter=20_1
     * 
     * 统一下单API说明: 
     * https://pay.weixin.qq.com/wiki/doc/api/native.php?chapter=9_1
     * @author 123
     *
     */
    public class Test {
    
    	public static void main(String[] args) {
    		// TODO Auto-generated method stub
    		//unifiedOrder();
    		orderQuery();
    	}
    	
    	 /**
         * 统一下单接口<br>
         * 场景:公共号支付、扫码支付、APP支付
         */
    	public static  void unifiedOrder (){
    		try {
    			//sdk类引用
    			WxPayConfigImpl config = WxPayConfigImpl.getInstance();
    			
    			WXPay pyPay = new WXPay(config);
    			
    			//订单号 (调整为自己的生产逻辑)
    			String out_trade_no = config.getMchID()+"-" + System.currentTimeMillis(); 
    			//公众号appid
    	        String appid = config.getAppID(); 
    	        //商业号 
    	        String mch_id = config.getMchID();  
    	        //key
    	        String key = config.getKey();  
    	        //随机数
    	        String nonce_str = WXPayUtil.generateNonceStr(); 
    	        //获取发起电脑 ip,可以用百度之类的代替来测试
    	        String spbill_create_ip = "123.123.123.123";
    	        //回调接口(反正本机测试时不用,随意搞一个能访问的)
    	        String notify_url = "http://www.weixin.qq.com/wxpay/pay.php";
    	        //模式
    	        String trade_type = "NATIVE";//"JSAPI";
    			
    			SortedMap<String,String> packageParams = new TreeMap<String,String>();  
    	        packageParams.put("appid", appid);
    	        packageParams.put("mch_id", mch_id);
    	        packageParams.put("nonce_str", nonce_str);
    	        packageParams.put("body", "test-coke");  //(调整为自己的名称)格式: 腾讯充值中心-QQ会员充值
    	        packageParams.put("out_trade_no", out_trade_no);
    	        packageParams.put("total_fee", "10"); //价格的单位为分
    	        packageParams.put("spbill_create_ip", spbill_create_ip);
    	        packageParams.put("notify_url", notify_url);
    	        packageParams.put("trade_type", trade_type);
    	        
    			Map runMap = pyPay.unifiedOrder(packageParams);
    	        
    	        System.out.println("=============returnXml==============");
    			System.out.println(runMap.toString());
    		} catch (Exception e) {
    			// TODO Auto-generated catch block
    			e.printStackTrace();
    		}
    
    		//发送:
    //		<?xml version="1.0" encoding="UTF-8" standalone="no"?>
    //		<xml>
    //		<appid>公众号APPID</appid>
    //		<body>test-coke</body>
    //		<mch_id>自己的商户号</mch_id>
    //		<nonce_str>rE8iTtCENf4VSOtOCZ0PIbkuuNklyFpw</nonce_str>
    //		<notify_url>http://www.weixin.qq.com/wxpay/pay.php</notify_url>
    //		<out_trade_no>自己的商户号-1561942616146</out_trade_no>
    //		<sign>907192B0875A02F199B45B7F30356644751DF6D4A2AFA77C0F3C226E4A60D276</sign>
    //		<sign_type>HMAC-SHA256</sign_type>
    //		<spbill_create_ip>123.123.123.123</spbill_create_ip>
    //		<total_fee>10</total_fee>
    //		<trade_type>NATIVE</trade_type>
    //		</xml>
    		
    		//结果:
    //		<xml><return_code><![CDATA[SUCCESS]]></return_code>
    //		<return_msg><![CDATA[OK]]></return_msg>
    //		<appid><![CDATA[公众号APPID]]></appid>
    //		<mch_id><![CDATA[自己的商户号]]></mch_id>
    //		<nonce_str><![CDATA[ayhkOwhZysjBQNR6]]></nonce_str>
    //		<sign><![CDATA[021F45467BA5119C389D5F08D768CC5A635687057BBD6445E6B7A1BBB34F4AA9]]></sign>
    //		<result_code><![CDATA[SUCCESS]]></result_code>
    //		<prepay_id><![CDATA[wx010855154971807287de77f31587946700]]></prepay_id>
    //		<trade_type><![CDATA[NATIVE]]></trade_type>
    //		<code_url><![CDATA[weixin://wxpay/bizpayurl?pr=kMwACCs]]></code_url>
    //		</xml>
    		
    		//解释后内容
    		//{nonce_str=ayhkOwhZysjBQNR6, code_url=weixin://wxpay/bizpayurl?pr=kMwACCs, appid=公众号APPID, sign=021F45467BA5119C389D5F08D768CC5A635687057BBD6445E6B7A1BBB34F4AA9, trade_type=NATIVE, return_msg=OK, result_code=SUCCESS, mch_id=自己的商户号, return_code=SUCCESS, prepay_id=wx010855154971807287de77f31587946700}
    		
    	}
    	
    	/**
         * 查询订单接口<br>
         * 场景:刷卡支付、公共号支付、扫码支付、APP支付
         */
    	public static void orderQuery(){
    		try {
    			//sdk类引用
    			WxPayConfigImpl config = WxPayConfigImpl.getInstance();
    			
    			WXPay pyPay = new WXPay(config);
    			
    			//订单号 
    			String out_trade_no = "自己的商户号-1561942616146"; 
    			//appid  
    	        String appid = config.getAppID();
    	        //商业号 
    	        String mch_id = config.getMchID();
    	        //随机数
    	        String nonce_str = WXPayUtil.generateNonceStr(); 
    	        //模式
    	        String trade_type = "NATIVE";//"JSAPI";
    			
    			SortedMap<String,String> packageParams = new TreeMap<String,String>();  
    	        packageParams.put("appid", appid);
    	        packageParams.put("mch_id", mch_id);
    	        packageParams.put("nonce_str", nonce_str);
    	        packageParams.put("out_trade_no", out_trade_no);
    	        
    			Map runMap = pyPay.orderQuery(packageParams);
    	        
    	        System.out.println("=============returnXml==============");
    			System.out.println(runMap.toString());
    		} catch (Exception e) {
    			// TODO Auto-generated catch block
    			e.printStackTrace();
    		}
    		//发送
    //		<?xml version="1.0" encoding="UTF-8" standalone="no"?>
    //		<xml>
    //		<appid>公众号APPID</appid>
    //		<mch_id>自己的商户号</mch_id>
    //		<nonce_str>epQ1ZECqQryQJv0ZOybGc8XIjWTJupNX</nonce_str>
    //		<out_trade_no>自己的商户号-1561942616146</out_trade_no>
    //		<sign>366964520A9209243A714EAB55D46E542B56152E705814D4DB20FF1567511DA9</sign>
    //		<sign_type>HMAC-SHA256</sign_type>
    //		</xml>
    		
    		//结果:
    //		<xml><return_code><![CDATA[SUCCESS]]></return_code>
    //		<return_msg><![CDATA[OK]]></return_msg>
    //		<appid><![CDATA[公众号APPID]]></appid>
    //		<mch_id><![CDATA[自己的商户号]]></mch_id>
    //		<device_info><![CDATA[]]></device_info>
    //		<nonce_str><![CDATA[dewGq9USU04gFwUE]]></nonce_str>
    //		<sign><![CDATA[94D3B1BFB852E19CB3F421DBC23D5A3AE5A7CBDC9448C8B146959036141EFE2F]]></sign>
    //		<result_code><![CDATA[SUCCESS]]></result_code>
    //		<total_fee>10</total_fee>
    //		<out_trade_no><![CDATA[自己的商户号-1561942616146]]></out_trade_no>
    //		<trade_state><![CDATA[NOTPAY]]></trade_state>
    //		<trade_state_desc><![CDATA[订单未支付]]></trade_state_desc>
    //		</xml>
    	}
    
    }
    

    注: WxPayConfigImpl, WXPayDomainSimpleImpl 实现 参考这位兄弟的微博

    https://blog.csdn.net/t_james/article/details/84653827#comments

    代码里的 [公众号APPID], [商户号], [key], [发起电脑 ip] 这几个换成自己公司的或自己客户的相关内容

    统一下单接口说明: 调用代码成功收到微信的回复, 这个测试是微信返回一个二维码连接 code_url, 拿到 code_url内容之后, 自己可以用google二维码工具显示到jsp页面上, 然后用手机扫描支付.  只要后台代码能与微信交互, 有没有页面都不重要. 

    订单查询接口: 这样列子中下单之后, 自己的代码要每隔2-3秒查询一次微信, 看看订单是不是支付成功了,  成功了说明客户支付了.

    整个流程如下:  调用[统一下单接口] -->把某个订单, 某个商品下单----> 调用成功收到微信的 code_url ------> 自己用二维码工具生成二维码 ------> 客户扫描二维码 ------> 每隔几秒调用[订单查询接口]  -------> 支付成功则完成交易.

     

    展开全文
  • 上篇文章中,讲解并且实现微信支付,既然微信下单成功了,那我们怎么知道用户有没有付款呢? 说这里,小编先要明确一下,我们主要的是针对开发一个支付的SDK。SDK通俗来讲,把我们所编写的一个项目可以打包成一个...
  • 【微信支付】H5支付开发文档 b. Java 后端微信支付demo 引入jar包 <dependency> <groupId>com.github.wxpay</groupId> <artifactId>wxpay-sdk</artifactId> ...
  • java后台实现支付宝支付接口、支付宝订单查询接口 前端为APP  最近项目APP需要接入微信、支付宝支付功能,在分配开发任务时,听说微信支付接口比支付宝支付接口要难实现,由于我开发经验不是那么丰富(现工作经验1...
  • 过程演示:当我们点击购买,弹出微信支付,我们输入密码进行支付。之后,当我们点击订单页面时,可以在已支付页面中看到我们已经购买的商品。
  • 微信小程序云开发微信支付订单查询、申请退款

    千次阅读 多人点赞 2020-09-01 13:55:43
    微信小程序云开发微信支付使用云开发微信支付功能的前提统一下单查询订单申请退款常见问题总结: 使用云开发微信支付功能的前提 小程序主体为企业或者工商个体户 小程序完成了微信认证 小程序接入微信支付 微信...
  • 写在前面昨晚一个朋友让我帮忙写一条 sql, 说是有一张订单表, 要查询出每天有多少人下单, 有多少人付款。听到这里可能很多人以为用 group by 分组, count 和 sum统计函数,问题就解决了。例如:select 下单时间,...
  • 介绍了如何使用RabbitMQ实现订单过期自动取消以及如何采用RabbitMQ实现商户主动向微信支付后台查询订单状态,一石二鸟。
  • 由于我开发经验不是那么丰富(现工作经验1年半)且未接触过支付接口开发,组里刚好又有支付接口的老司机,所以很自然把简单的支付宝接口开发任务交给了我,看来开发组的组长还是很好人的嘛.....,废话就多说了,...
  • 我先在要做这样的功能:用户在创建订单后,订单表中记入的是未付款状态,如果用户在30分钟后,还未付款,然后就把该订单给取消。关于用户创建订单,30分钟后还没付款,取消该订单的逻辑是怎么实现的。我自己的想了两...
  • php 支付宝支付回调与查询订单

    千次阅读 2018-09-29 17:31:22
    //如果没有做过处理,根据订单号(out_trade_no)在商户网站的订单系统中查到该笔订单的详细,并执行商户的业务程序 //请务必判断请求时的total_amount与通知时获取的total_fee为一致的 //如果有做过处理,执行...
  • QR二维码的生成 微信支付第三方平台 统一下单思路说明 微信支付二维码实现思路 支付查询流程 测试支付结果的演示 对接订单生成逻辑&生成支付单完成支付 付款成功后修改订单状态&支付单状态 ...
  • 微信支付付款成功,回调函数执行

    千次阅读 2019-07-31 09:09:34
    最近用laravel框架做个微商城接微信支付,明明付款成功回调函数就是执行,数据库存没变化 网上也了好久,发现是因为回调路由放了登录中间件里边... //微信支付回调接口 Route::post('wxpay_notify', 'Front...
  • 我先在要做这样的功能:用户在创建订单后,订单表中记入的是未付款状态,如果用户在30分钟后,还未付款,然后就把该订单给取消。关于用户创建订单,30分钟后还没付款,取消该订单的逻辑是怎么实现的。我自己的想了两...
  • ① 首先要调起微信支付 ,执行微信或者是支付宝支付上图中已经注释的查询该笔订单是不是真正的意义上的支付成功了,这个查询要放在服务中去查询也就是 调起的QueryPayResultServices②再看这个... ...
  • 订单支付流程思路 使用沙箱支付接口
  • 电商项目实战之支付宝支付订单

    千次阅读 2021-08-24 19:22:12
    介绍订单支付与支付宝交互流程,了解RSA加解密流程、内网穿透搭建和收单等功能
  • 考虑用线程或者定时任务,知道有没有人做过这个类似的异步处理通知接口基本上都需要做这种处理的,因为异步的回调通知总会因为网络或者处理延时造成没有进行回调通知。具体的做法就是首先在调用异步接口前,需要...
  • 解决支付订单,重复提交问题!

    千次阅读 2021-10-09 00:24:02
    点击上方“朱小厮的博客”,选择“设为星标”后台回复"书",获取后台回复“k8s”,可领取k8s资料概述如图是一个简化的下单流程,首先是提交订单,然后是支付支付的话,一般是走支付网关(支付...
  • 支付成功与否,可取值:success not_pay 是 transaction_id 微信交易号 微信系统中的交易流水号,可用于查询订单状态 是 time_end 交易付款时间 格式为2016-07-28 16:01:01 是 微信退款订单 ...
  • 微信支付支持支付、退款、转款。有时想对相关信息进行查询。了解相对应的进度。那么通过这些查询接口就可完成对应的事情。
  • 常见错误是total_fee、refund_fee金额设定错误,这两个参数单位为分,并且只能为整数,total_fee的值需与原始的订单支付的金额相对应,refund_fee的值能超过可退款的余额 appid 需与小程序id对应 退款单out_...
  • 其实这些处理方式并只是局限于支付系统,也可以适用于其他系统,大家可以借鉴,应用自己系统中,提高自己系统的健壮性。 异常是系统运行可避免会发生的问题,如果一切都正常,我们的系统设计将会相当简单。 ...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 34,567
精华内容 13,826
关键字:

付款成功订单查不到