微信支付踩坑总结

  • 前几天帮助朋友解决了下微信支付问题,把遇到的问题汇总下,以后遇到方便回顾。

    微信支付操作流程

  • 支付前统一下单(预下单) ,返回预支付交易会话标识
  • 带着返回的信息及认证签名信息去支付
  • 支付完成返回结果(同时会给服务端返回支付结果,这个比较赞)
    就这么个流程、app和后端交互还是纯粹服务端支付都基本这个逻辑。

    支付实例

  • 统一下单
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    $moeny = $orderInfo['money'];
    $tal_fee = $moeny * 100; //单位分
    $input = new \WxPayUnifiedOrder(); //sdk方法
    $input->SetBody("xx科技-xx增值服务"); //设置相关参数
    $input->SetAttach("微信支付");
    $input->SetOut_trade_no($orderInfo['id']);
    $input->SetTotal_fee($tal_fee);
    $input->SetTime_start(date("YmdHis"));
    $input->SetTime_expire(date("YmdHis", time() + 600));
    $input->SetGoods_tag("WXG");

    //$notifyUrl = U('api/updateorder/notify','','',true); //这一步 url中不允许包含参数,意味着只能使用静态地址
    //如果启用了伪静态就可以使用这种地址,否则就配置固定地址吧
    $notifyUrl = C('WXPAY_NOTIFYURL'); //thinkphp 配置项里设置的回调地址
    $input->SetNotify_url($notifyUrl); //设置微信支付成功通知地址
    $input->SetTrade_type("APP"); //根据实际场景设置 这是通过php请求下单后返回信息给app 让app调起的支付 App方式不需要传openId
    $input->SetProduct_id($orderInfo['xx_id']);
    $order = \WxPayApi::unifiedOrder($input); //通过sdk将数据转换xml 并curl请求发送
  • 将信息返给app
    通过上一步,请求预下成功单后,后端执行二次签名后,数据返给app。app执行调起微信支付操作。
    这一步官方文档
    步骤3:统一下单接口返回正常的prepay_id,再按签名规范重新生成签名后,将数据传输给APP。参与签名的字段名为appId,partnerId,prepayId,nonceStr,timeStamp,package。注意:package的值格式为Sign=WXPay
    这里有坑需要注意,微信严格区分大小写,这里的大写全都需要使用小写
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     $time = time();
    //涉及签名字段
    $signData = array(
    'appid' => $order['appid'],
    'partnerid' => C('WXPAY_MCHID'),
    'prepayid' => $order['prepay_id'],
    'noncestr' => $order['nonce_str'],
    'timestamp' => $time,
    'package' => 'Sign=WXPay',
    );
    //组合完以后执行二次签名,并把需要数据传给前端

    支付成功以后

  • 后端需要验证微信成功回调、处理支付成功业务逻辑。这里回调结果通知采用的是流方式回传。
    1
    2
    3
    $xml = file_get_contents('php://input');
    //接收回调通知
    //todo 签名验证、业务逻辑处理

    微信支付常见错误问题需要注意的地方

  • 无回调通知: 确认url是否静态地址,不能带有参数,保证可访问的地址。
  • app端调不起App : 检查二次签名,只有介绍的几个字段参与二次签名,且字母区分大小写。
  • 错误码58: 注意检查curl证书地址,如果地址正确且一直报58,尝试改用绝对地址。
  • 其他下载sdk demo 过一遍就基本ok了。在看看文档。

    相关链接

  • sdk demo地址: https://pay.weixin.qq.com/wiki/doc/api/jsapi.php?chapter=11_1
  • 业务流程及Api文档地址:https://pay.weixin.qq.com/wiki/doc/api/app/app.php?chapter=8_3
  • 常见curl错误码:http://www.cnblogs.com/wainiwann/p/3492939.html