Laravel JSAPI微信支付遇到的问题以及解决办法

Song1603 次浏览0个评论2021年01月07日

laravel有很多拓展包可以帮您快速开发微信支付Laravel-pay 最优雅的微信支付 ,但是部分功能还是需要自己开发比如JSAPI调起支付,微信支付Demo下载地址为:下载地址

JSAPI调起支付

具体开发文档参考PHP laravel 微信 JsApi 支付详细过程 ,但是大家可以参考文档直接开发。下载的demo。

遇到的问题

1、openid刷新就报错

首次加载网页授权没问题,但是一刷新或返回就报错;大家可以结合session使用,如果openid存在就不获取,否则就获取。这样即可解决刷新报错问题。

2、laravel异步通知获取不到微信支付异步通知的问题

参考文档微信支付结果通知可以看到异步通知的数据为xml格式。所以通过$request->all()无法获取数据。

$res = $request->all();
# 获取为空
$res = $request->getContent();
# 可以获取到xml格式数据
<xml>
  <appid><![CDATA[wx2421b1c4370ec43b]]></appid>
  <attach><![CDATA[支付测试]]></attach>
  <bank_type><![CDATA[CFT]]></bank_type>
  <fee_type><![CDATA[CNY]]></fee_type>
  <is_subscribe><![CDATA[Y]]></is_subscribe>
  <mch_id><![CDATA[10000100]]></mch_id>
  <nonce_str><![CDATA[5d2b6c2a8db53831f7eda20af46e531c]]></nonce_str>
  <openid><![CDATA[oUpF8uMEb4qRXf22hE3X68TekukE]]></openid>
  <out_trade_no><![CDATA[1409811653]]></out_trade_no>
  <result_code><![CDATA[SUCCESS]]></result_code>
  <return_code><![CDATA[SUCCESS]]></return_code>
  <sign><![CDATA[B552ED6B279343CB493C5DD0D78AB241]]></sign>
  <time_end><![CDATA[20140903131540]]></time_end>
  <total_fee>1</total_fee>
  <coupon_fee><![CDATA[10]]></coupon_fee>
  <coupon_count><![CDATA[1]]></coupon_count>
  <coupon_type><![CDATA[CASH]]></coupon_type>
  <coupon_id><![CDATA[10000]]></coupon_id>
  <trade_type><![CDATA[JSAPI]]></trade_type>
  <transaction_id><![CDATA[1004400740201409030005092168]]></transaction_id>
</xml>

3、laravel微信支付异步通知xml数据转化为json或数组

您可以使用如下的方法转化将xml转化为数组。

public static function toXml($data): string
{
    if (!is_array($data) || count($data) <= 0) {
        throw new InvalidArgumentException('Convert To Xml Error! Invalid Array!', 2);
    }

    $xml = '<xml>';
    foreach ($data as $key => $val) {
        $xml .= is_numeric($val) ? '<'.$key.'>'.$val.'</'.$key.'>' :
                                   '<'.$key.'><![CDATA['.$val.']]></'.$key.'>';
    }
    $xml .= '</xml>';

    return $xml;
}

public static function fromXml($xml): array
{
    if (!$xml) {
        throw new InvalidArgumentException('Convert To Array Error! Invalid Xml!', 3);
    }

    libxml_disable_entity_loader(true);

    return json_decode(json_encode(simplexml_load_string($xml, 'SimpleXMLElement', LIBXML_NOCDATA), JSON_UNESCAPED_UNICODE), true);
}

提交评论

请登录后评论

用户评论

    当前暂无评价,快来发表您的观点吧...

更多相关好文

    当前暂无更多相关好文推荐...