大雕哥
你身边最懂互联网的朋友

智慧收款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的地方啊
没办法,只能修改代码修改数据库了:

温馨提示: 隐藏内容需要 回复评论 后才能查看, 评论后请 刷新 !.


先完成数据库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值的处理:

温馨提示: 隐藏内容需要 回复评论 后才能查看, 评论后请 刷新 !.

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

赞(0) 解决问题,就是我最大的快乐
转载请保留出处:大雕哥 » 智慧收款bobo_pay微信扫码订单创建失败,收款失败的解决方法
分享到: 更多 (0)

评论 1

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址
  1. #-9

    请问这个是修改的哪个版本?

    寒狼5个月前 (08-02)回复

大雕哥,做你身边最懂互联网的朋友

邮箱订阅联系我们

如果觉得文章有用可以打赏一下文章作者

支付宝扫一扫打赏

微信扫一扫打赏