PC端、手机浏览器H5支付没问题,支付完成也能收到订单短信通知
唯独在公众号内支付时,可以正常付款,就是订单会显示成待支付状态,而且也收不到订单短信通知
在文档和论坛内搜索过,好像没看到相关提示;微信也做过全部缓存清除;服务器环境按照安装文档配置的,服务器上只有这一个网站;没动过源代码
忘了说,是fecyo
首先,支付没有问题,演示地址测试微信支付都是没有问题的,这个应该更多的是您的配置问题,微信的东西配置繁杂,用起来还是得注意很多东西
1.这个应该是一个典型支付问题,您把标题改成fecyo微信内部h5支付(JsApi支付)付款成功,但商城订单状态仍为未支付
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\app\apphtml5\modules\Payment\controllers\WxpayjsapiController
@fecyo的文件路径 addons/fecmall/fecyo
@fecyo
addons/fecmall/fecyo
微信支付成功后,微信会给fecmall发送一个消息
发送消息的url,是在支付start已经将接收微信消息的url作为参数传递给微信支付, 付款成功后,微信支付往这个url发送支付信息,更改fecmall订单状态,微信内部支付,这个url是payment/wxpayjsapi/ipn,也就是这个controller的action方法
接收微信消息的url
payment/wxpayjsapi/ipn
public function actionIpn() { Yii::$service->payment->wxpay->ipn(); }
3.1执行payment wxpay services里面的ipn()方法
payment wxpay services
ipn()
打开文件@fecshop\services\payment\WxpayJsApi
@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,下面的函数,是接收到微信支付付款消息,验证消息安全后执行的方法:
@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); 这个就是更新订单信息的函数
\Yii::$service->payment->wxpay->ipnUpdateOrder($arr);
3.4打开文件@fecshop\services\payment\Wxpay
@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如下,也是该文件
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; } }
后面的代码您自己找吧,已经把微信支付涉及的文件给您贴清楚了。
!!一定改一下标题,后面遇到这个问题的童鞋可以参考这里排查具体问题
@Fecmall #2楼 技术太菜,至今未排查出啥问题 :broken_heart:
@JonLee #3楼 升级一下fecyo新版本吧。
@Fecmall #4楼 就是看到出了新版本,昨晚才专门开了一台服务器来试试,结果还是这样 :sob:
1.你是安装的全新fecmall-2.8.1? 还是从老版本升级的? 前一个月诊断了一个和你类似的用户,就是因为升级问题导致的(外层手动更新的部分没有更新),如果您安装的全新版本,可以忽略。
2.如何debug,上面都写了,您自己研究吧,我只能帮到这里了
3.如果全新安装的fecmall,代码没有问题,很大的问题,是您的微信支付和微信公众号设置有问题
@Fecmall [#6楼](#comment6) 是全新安装的;看到第1条,去瞧了瞧宝塔后台,发现软件商店显示的是fecmall 2.5.1 版本,
但是根据第三条,应该是我配置的问题
@JonLee #7楼 宝塔的版本号,忽略即可,这是宝塔插件的版本号,不是fecmall的
应该是你配置问题
@Fecmall #8楼 不知道这是不是与没设置VUE端的域名有关,在支付授权目录和网页授权域名里,我只设置了h5的域名,莫非jsapi支付的时候还用到了其他域名(比如server、api)的接口之类的
@JonLee #9楼 pc和h5,需要设置相关的域名
微信小程序需要设置appserver对应的域名,要把域名写到微信支付设置里面。
http://www.fecmall.com/doc/fecshop-guide/instructions/cn-2.0/guide-fecmall_payment_wx_method.html
@Fecmall [#6楼](#comment6) (外层手动更新的部分没有更新),请问这个外层手动更新的部分有哪些?
已解决。国内沙箱账号有这个问题,新建了美国的沙箱账号后一切正常了。
原问题:
@Fecmall [#10楼](#comment10) 我遇到类似问题,版本:fecmall2.8.4,fecro1.3.0 ,paypal快捷付款沙箱环境,IPN已设置
pc和h5端都是选用paypal的余额付款,付款后跳转到了付款成功页面,但是到了订单详情后,看到的状态仍然是付款处理中。
官网demo中测试付款成功后是可以更新订单状态为已付款的,所以不知道是不是我哪里设置的不对呢?
@gglaosi #12楼 你的问题解决了?还是没有?
@Fecmall #13楼 已解决