智慧收款bobo_pay微信扫码订单创建失败,收款失败的解决方法

最近接触一个新的模块《智慧收款》,后台配置好默认的微信参数,新建门店,然后门店不设置参数的情况下,门店可以用微信扫码,但只要门店设置自己的微信收款商户参数就不行,总提示“订单创建失败,收款失败”。

反复找原因发现,支付宝扫码的时候,可以支持新建门店以自己的支付宝商户参数收款,唯独就微信问题,看来不是配置参数的问题,应该是代码方面的问题。

这个模块的目录结构相对比较简单,大部分核心的代码都在site.php这个文件里,直接读代码,找到调用微信扫码付款的这一部分:doMobileDowxpayerweima()这个函数

$mendianset = pdo_fetch(“select * from ” . tablename(“bobo_pay_mendianwxpaysetting”) . ” where weid=$weid and mid=” . $_SESSION[‘bobo_pay_userlogin’][‘mendianid’]);

$set_info = pdo_fetch(“select * from ” . tablename(“bobo_pay_wxsetting”) . ” where weid=$weid”);

$appid = $set_info[‘appid’];

$mch_id = $set_info[‘mchid’]

$body = $mendianset[‘body’] ? $mendianset[‘body’] : $set_info[‘body’];

进一步查看找到原因了,原来发起微信支付他都是读取的“bobo_pay_wxsetting”这张表,而这张表里记录的是系统默认的配置参数,并没有读取“bobo_pay_mendianwxpaysetting”这张门店参数配置表

但是他的“$body”参数却又是做了一个三目运算取的“$mendianset[‘body’]”门店参数,可能是开发这个模块的人粗心了,所以我们要仿照“$body”对“$appid”和“$mch_id”进行修改。

$appid = $mendianset[‘sub_appid’] ? $mendianset[‘sub_appid’] : $set_info[‘appid’];

$mch_id = $mendianset[‘mch_id’] ? $mendianset[‘mch_id’] : $set_info[‘mchid’];

保存一下代码,再调试一下发现还是不能生存微信付款二维码,通过调试查看又得到新的错误:

{“return_code”:”FAIL”,”return_msg”:”普通商户不允许传sub_mch_id”}

没办法,再进一步查看代码吧:

$res = $this->wxprecreate($orderno, $body, $money, $appid, $mch_id);

查看“wxprecreate”这个函数代码,又发现新的问题:

if ($_SESSION[‘bobo_pay_userloginext’][‘sub_appid’]) {
$input->SetSub_Appid($_SESSION[‘bobo_pay_userloginext’][‘sub_appid’]);
}
if ($_SESSION[‘bobo_pay_userloginext’][‘mch_id’]) {
$input->SetSub_Mch_id($_SESSION[‘bobo_pay_userloginext’][‘mch_id’]);
}

通过对比官方微信支付文档,发现根本没有设置“Sub_”的参数,可能他是想设置服务商接口,但是现在的微信支付又不能通过服务商发起代付,必须要商户ID和商户公众号APPID一致才能发起支付,所以我们还需要再改:

$input->SetAppid($appid);
$input->SetMch_id($mch_id);

这回总该行了吧?可惜….还是不行,又报了新的错误:

{“return_code”:”FAIL”,”return_msg”:”签名错误”}

熟悉微信支付SDK的应该知道,签名算法是在“WxPay.Data.php”这个文件的,所以直接定位过去,找到:“MakeSign”函数:

$key=$_SESSION[‘wxkey’];

$string = $string . “&key=”.$key;

通过对比官方SDK的签名算法,key就是微信支付的商户密钥,那他这里的key是哪来的呢?进一步跟踪代码,找到了:

$isexist = pdo_fetch(“select * from ” . tablename(“bobo_pay_wxsetting”) . ” where weid=$weid”);
if ($isexist) {
$_SESSION[‘wxkey’] = $isexist[‘key’];
}

又是直接读取的站点默认配置参数,难怪报签名错误,前面都改成了新建门店自己的微信商户配置,这里还是默认的站点key,能不报错吗
可这回修改没那么简单了,因为“bobo_pay_wxsetting”默认站点配置表里有key的字段,而门店参数表里却没有,同时后台的配置门店微信参数里也没有设置key的地方啊
没办法,只能修改代码修改数据库了:
[reply]
— 2018-05-27 by:diaoge.cc 修复门店商户无法生成微信支付二维码
alter table ims_bobo_pay_mendianwxpaysetting add `key` varchar(50) not null default ”;
[/reply]
先完成数据库key字段的扩充
再找到门店微信配置的页面“index1.html”,增加代码:

<div class=”form-group”>
<label class=”col-xs-12 col-sm-3 col-md-2 control-label”><span style=”color:red”>*</span>商户支付密钥key</label>
<div class=”col-sm-9 col-xs-12″>
<input id=”key” type=”text” name=”key” class=”form-control” value=”{$set_info[‘key’]}” />
<span>商户支付密钥key</span>
</div>
</div>

再找到后台处理POST提交的代码,添加对key的处理:

if ($_GPC[‘key’] == ”) {
message(‘商户支付密钥key不能为空!’, ”, ‘error’);
exit;
} else {
$data[‘key’] = $_GPC[‘key’];
}

然后还不能忘了再回到“dowxpayerweima”函数里,增加SESSION读取key值的处理:

[reply]

// 2018-05-27 by:diaoge.cc 修复门店商户无法生成微信支付二维码
$_SESSION[‘wxkey’]  = $mendianset[‘key’] ? $mendianset[‘key’] : $set_info[‘key’];
[/reply]

这下可总算解决了,保存代码清理缓存,在后台对新建门店的微信配置参数里,填入“商户支付密钥key”,再试试收银界面的微信支付扫码,perfect,可以了!

人已赞赏
雕技术

微信模版消息TM00335找不到的解决办法

2018-5-27 13:24:57

雕技术

php调试输出log日志文件的代码

2018-5-27 20:37:21

免责声明本文中提到的资源均来自于互联网,仅供个人学习交流,若您喜欢本文可附上原文链接随意转载。
版权人申诉:我要申诉
0 条回复 A文章作者 M管理员
    暂无讨论,说说你的看法吧
个人中心
购物车
优惠劵
今日签到
有新私信 私信列表
搜索