fecyo微信内部h5支付(JsApi支付)付款成功,但商城订单状态仍为未支付

bug问题 · JonLee · 于 3年前 发布 · 2457 次阅读

PC端、手机浏览器H5支付没问题,支付完成也能收到订单短信通知

唯独在公众号内支付时,可以正常付款,就是订单会显示成待支付状态,而且也收不到订单短信通知

在文档和论坛内搜索过,好像没看到相关提示;微信也做过全部缓存清除;服务器环境按照安装文档配置的,服务器上只有这一个网站;没动过源代码

共收到 15 条回复
JonLee#13年前 0 个赞

忘了说,是fecyo

Fecmall#23年前 0 个赞

首先,支付没有问题,演示地址测试微信支付都是没有问题的,这个应该更多的是您的配置问题,微信的东西配置繁杂,用起来还是得注意很多东西

1.这个应该是一个典型支付问题,您把标题改成fecyo微信内部h5支付(JsApi支付)付款成功,但商城订单状态仍为未支付

2.资料,微信支付文档:http://www.fecmall.com/doc/fecshop-guide/instructions/cn-2.0/guide-fecmall_payment_wx_method.html 您仔细看一下,仔细排查设置是否完成

3.当然不排除文档可能某些点没有描述清楚,这个需要您自己排查一下代码,定位问题, 需要注意的是,微信内部支付是Jsapi支付

4.微信支付controller文件:@fecyo\app\apphtml5\modules\Payment\controllers\WxpayjsapiController

@fecyo的文件路径 addons/fecmall/fecyo

微信支付成功后,微信会给fecmall发送一个消息

发送消息的url,是在支付start已经将接收微信消息的url作为参数传递给微信支付, 付款成功后,微信支付往这个url发送支付信息,更改fecmall订单状态,微信内部支付,这个url是payment/wxpayjsapi/ipn,也就是这个controller的action方法


    public function actionIpn()
    {
        Yii::$service->payment->wxpay->ipn();
    }

3.1执行payment wxpay services里面的ipn()方法

打开文件@fecshop\services\payment\WxpayJsApi

/**
     * 接收IPN消息的url,接收微信支付的异步消息,进而更改订单状态。
     */
    public function ipn()
    {
        $notifyFile       = Yii::getAlias('@fecshop/services/payment/wxpay/notify.php');
        require_once($notifyFile);
        \Yii::info('begin ipn', 'fecshop_debug');
        $notify = new \PayNotifyCallBack();
        $notify->Handle(false);
    }

3.2打开文件@fecshop/services/payment/wxpay/notify.php,下面的函数,是接收到微信支付付款消息,验证消息安全后执行的方法:

//重写回调处理函数
    public function NotifyProcess($data, &$msg)
    {
        \Yii::info("call back:" . json_encode($data), 'fecshop_debug');
        $notfiyOutput = [];
        if (!array_key_exists("transaction_id", $data)) {
            $msg = "输入参数不正确";
            
            return false;
        }
        //查询订单,判断订单真实性
        if (!$this->Queryorder($data["transaction_id"])) {
            $msg = "订单查询失败";
            
            return false;
        }
        $arr = $this->getDataArray($data);
        
        return \Yii::$service->payment->wxpay->ipnUpdateOrder($arr);
    }
    

3.3在上面的函数最后,执行\Yii::$service->payment->wxpay->ipnUpdateOrder($arr); 这个就是更新订单信息的函数

3.4打开文件@fecshop\services\payment\Wxpay

public function ipnUpdateOrder($data)
    {
        \Yii::info('ipn order process', 'fecshop_debug');
        $incrementId    = $data['out_trade_no'];
        $transaction_id = $data['transaction_id'];
        $total_fee      = $data['total_fee'];
        $fee_type       = $data['fee_type'];
        if ($incrementId && $transaction_id && $total_fee) {
            $this->_order = Yii::$service->order->getByIncrementId($incrementId);
            Yii::$service->payment->setPaymentMethod($this->_order['payment_method']);
            $base_grand_total = $this->_order['base_grand_total'];
            $order_total_amount = Yii::$service->page->currency->getCurrencyPrice($base_grand_total, 'CNY');
            \Yii::info('check order totla amouont['.($order_total_amount * 100).' == '.$total_fee.']', 'fecshop_debug');
            // 微信支付的人民币单位为分
            if(bccomp($order_total_amount * 100, $total_fee) !== 0){
                
                return false;
            }
            \Yii::info('updateOrderInfo', 'fecshop_debug');
            // 更改订单状态
            if ($this->updateOrderInfo($incrementId, $transaction_id, false)) { //支付成功调用服务执行订单状态改变,清空购物车和发送邮件操作
                \Yii::info('updateOrderInfo Success', 'fecshop_debug');
                
                return true;
            }
        }
    }

函数updateOrderInfo如下,也是该文件

/**
     * 微信 支付成功后,对订单的状态进行修改
     * 如果支付成功,则修改订单状态为支付成功状态。
     * @param $out_trade_no | string , fecshop的订单编号 increment_id
     * @param $trade_no | 微信支付交易号
     * @param isClearCart | boolean 是否清空购物车
     *
     */
    protected function updateOrderInfo($out_trade_no, $trade_no, $isClearCart=true)
    {
        if (!empty($out_trade_no) && !empty($trade_no)) {
            if ($this->paymentSuccess($out_trade_no, $trade_no)) {
                // 清空购物车
                if ($isClearCart) {
                    Yii::$service->cart->clearCartProductAndCoupon();
                }
                
                return true;
            }
        } else {
            Yii::$service->helper->errors->add('wxpay payment fail,resultCode: {result_code}', ['result_code' => $resultCode]);
            
            return false;
        }
    }

后面的代码您自己找吧,已经把微信支付涉及的文件给您贴清楚了。

!!一定改一下标题,后面遇到这个问题的童鞋可以参考这里排查具体问题

JonLee#33年前 0 个赞

@Fecmall #2楼 技术太菜,至今未排查出啥问题 :broken_heart:

Fecmall#43年前 0 个赞

@JonLee #3楼 升级一下fecyo新版本吧。

JonLee#53年前 0 个赞

@Fecmall #4楼 就是看到出了新版本,昨晚才专门开了一台服务器来试试,结果还是这样 :sob:

Fecmall#63年前 0 个赞

1.你是安装的全新fecmall-2.8.1? 还是从老版本升级的? 前一个月诊断了一个和你类似的用户,就是因为升级问题导致的(外层手动更新的部分没有更新),如果您安装的全新版本,可以忽略。

2.如何debug,上面都写了,您自己研究吧,我只能帮到这里了

3.如果全新安装的fecmall,代码没有问题,很大的问题,是您的微信支付和微信公众号设置有问题

JonLee#73年前 0 个赞

@Fecmall [#6楼](#comment6) 是全新安装的;看到第1条,去瞧了瞧宝塔后台,发现软件商店显示的是fecmall 2.5.1 版本,

但是根据第三条,应该是我配置的问题

Fecmall#83年前 0 个赞

@JonLee #7楼 宝塔的版本号,忽略即可,这是宝塔插件的版本号,不是fecmall的

应该是你配置问题

JonLee#93年前 0 个赞

@Fecmall #8楼 不知道这是不是与没设置VUE端的域名有关,在支付授权目录和网页授权域名里,我只设置了h5的域名,莫非jsapi支付的时候还用到了其他域名(比如server、api)的接口之类的

Fecmall#103年前 0 个赞

@JonLee #9楼 pc和h5,需要设置相关的域名

微信小程序需要设置appserver对应的域名,要把域名写到微信支付设置里面。

http://www.fecmall.com/doc/fecshop-guide/instructions/cn-2.0/guide-fecmall_payment_wx_method.html

dream#113年前 0 个赞

@Fecmall [#6楼](#comment6) (外层手动更新的部分没有更新),请问这个外层手动更新的部分有哪些?

gglaosi#123年前 0 个赞

已解决。国内沙箱账号有这个问题,新建了美国的沙箱账号后一切正常了。

原问题:

@Fecmall [#10楼](#comment10) 我遇到类似问题,版本:fecmall2.8.4,fecro1.3.0 ,paypal快捷付款沙箱环境,IPN已设置

pc和h5端都是选用paypal的余额付款,付款后跳转到了付款成功页面,但是到了订单详情后,看到的状态仍然是付款处理中。

官网demo中测试付款成功后是可以更新订单状态为已付款的,所以不知道是不是我哪里设置的不对呢?

Fecmall#133年前 0 个赞

@gglaosi #12楼 你的问题解决了?还是没有?

gglaosi#143年前 0 个赞

@Fecmall #13楼 已解决

15楼 已删除.
16楼 已删除.
添加回复 (需要登录)
需要 登录 后方可回复, 如果你还没有账号请点击这里 注册
Your Site Analytics