ホームページ  >  記事  >  WeChat アプレット  >  小規模プログラム開発に対する企業向け支払い

小規模プログラム開発に対する企業向け支払い

Y2J
Y2Jオリジナル
2017-05-09 09:58:113160ブラウズ

この記事を書く主な目的は、WeChat パブリック プラットフォームによって提供される SDK がこの機能の SDK 実装を提供していないためです

実際、最終的な実装は依然として WeChat パブリック プラットフォームの開発ドキュメントと SDK に依存しています。 。

エンタープライズ決済のアプリケーションシナリオ: 公式アカウントは、返金処理や財務決済など、フォローされているユーザーに支払いを行います。

まず実装のアイデアについて話しましょう:

には クラスライブラリが付属しています SDK ではこれに基づいて、WxMchPay コンポーネントが拡張され、エンタープライズ決済機能の拡張を実現します。

あまり言うことはありません。次は、エンタープライズ ペイメントを実装するために SDK を継承するコンポーネントです。コントローラー層関数の実装:

<?php// 引入SDKimport(&#39;Common.Util.WxPay&#39;);/**
 * 微信企业付款操作类
 * Author  :  Max.wen
 * DateTime: <15/9/16 11:00> */class WxMchPay extends Wxpay_client_pub
{    /**
     * API 参数
     * @var array
     * &#39;mch_appid&#39;         # 公众号APPID
     * &#39;mchid&#39;             # 商户号
     * &#39;device_info&#39;       # 设备号
     * &#39;nonce_str&#39;         # 随机字符串
     * &#39;partner_trade_no&#39;  # 商户订单号
     * &#39;openid&#39;            # 收款用户openid
     * &#39;check_name&#39;        # 校验用户姓名选项 针对实名认证的用户
     * &#39;re_user_name&#39;      # 收款用户姓名
     * &#39;amount&#39;            # 付款金额
     * &#39;desc&#39;              # 企业付款描述信息
     * &#39;spbill_create_ip&#39;  # Ip地址
     * &#39;sign&#39;              # 签名     */
    public $parameters = [];    public function construct()
    {        $this->url = &#39;https://api.mch.weixin.qq.com/mmpaymkttransfers/promotion/transfers&#39;;        $this->curl_timeout = WxPayConf_pub::CURL_TIMEOUT;
    }    /**
     * 生成请求xml数据
     * @return string     */
    public function createXml()
    {        $this->parameters[&#39;mch_appid&#39;] = WxPayConf_pub::APPID;        $this->parameters[&#39;mchid&#39;]     = WxPayConf_pub::MCHID;        $this->parameters[&#39;nonce_str&#39;] = $this->createNoncestr();        $this->parameters[&#39;sign&#39;]      = $this->getSign($this->parameters);        return $this->arrayToXml($this->parameters);
    }    /**
     *     作用:使用证书,以post方式提交xml到对应的接口url     */
    function postXmlSSLCurl($xml,$url,$second=30)
    {        $ch = curl_init();        //超时时间
        curl_setopt($ch,CURLOPT_TIMEOUT,$second);        //这里设置代理,如果有的话
        //curl_setopt($ch,CURLOPT_PROXY, &#39;8.8.8.8&#39;);
        //curl_setopt($ch,CURLOPT_PROXYPORT, 8080);
        curl_setopt($ch,CURLOPT_URL, $url);
        curl_setopt($ch,CURLOPT_SSL_VERIFYPEER,FALSE);
        curl_setopt($ch,CURLOPT_SSL_VERIFYHOST,FALSE);        //设置header
        curl_setopt($ch,CURLOPT_HEADER,FALSE);        //要求结果为字符串且输出到屏幕上
        curl_setopt($ch,CURLOPT_RETURNTRANSFER,TRUE);        //设置证书
        curl_setopt($ch,CURLOPT_CAINFO, WxPayConf_pub::SSLROOTCA_PATH);        //使用证书:cert 与 key 分别属于两个.pem文件
        //默认格式为PEM,可以注释
        curl_setopt($ch,CURLOPT_SSLCERTTYPE,&#39;PEM&#39;);
        curl_setopt($ch,CURLOPT_SSLCERT, WxPayConf_pub::SSLCERT_PATH);        //默认格式为PEM,可以注释
        curl_setopt($ch,CURLOPT_SSLKEYTYPE,&#39;PEM&#39;);
        curl_setopt($ch,CURLOPT_SSLKEY, WxPayConf_pub::SSLKEY_PATH);        //post提交方式
        curl_setopt($ch,CURLOPT_POST, true);
        curl_setopt($ch,CURLOPT_POSTFIELDS,$xml);        $data = curl_exec($ch);        //返回结果
        if($data){
            curl_close($ch);            return $data;
        }        else {            $error = curl_errno($ch);            echo "curl出错,错误码:$error"."<br>";            echo "<a href=&#39;http://curl.haxx.se/libcurl/c/libcurl-errors.html&#39;>错误原因查询</a></br>";
            curl_close($ch);            return false;
        }
    }


}

上記の 2 つの部分のコードを完了すると、基本的にエンタープライズ ペイメント API を正常に呼び出すことができます。 返された結果のデータ構造の例:

<?php/**
 * Author  :  Max.wen
 * DateTime: <15/9/20 16:47> */namespace Home\Controller;class TestController extends CommonController
{    /**
     * 企业付款测试     */
    public function rebate()
    {
        import(&#39;Common.Util.WxMchPay&#39;);        $mchPay = new \WxMchPay();        // 用户openid
        $mchPay->setParameter(&#39;openid&#39;, &#39;oy2lbszXkgvlEKThrzqEziKEBzqU&#39;);        // 商户订单号
        $mchPay->setParameter(&#39;partner_trade_no&#39;, &#39;test-&#39;.time());        // 校验用户姓名选项
        $mchPay->setParameter(&#39;check_name&#39;, &#39;NO_CHECK&#39;);        // 企业付款金额  单位为分
        $mchPay->setParameter(&#39;amount&#39;, 100);        // 企业付款描述信息
        $mchPay->setParameter(&#39;desc&#39;, &#39;开发测试&#39;);        // 调用接口的机器IP地址  自定义
        $mchPay->setParameter(&#39;spbill_create_ip&#39;, &#39;127.0.0.1&#39;); # getClientIp()
        // 收款用户姓名
        // $mchPay->setParameter(&#39;re_user_name&#39;, &#39;Max wen&#39;);
        // 设备信息
        // $mchPay->setParameter(&#39;device_info&#39;, &#39;dev_server&#39;);

        $response = $mchPay->postXmlSSL();        if( !empty($response) ) {            $data = simplexml_load_string($response, null, LIBXML_NOCDATA);            echo json_encode($data);
        }else{            echo json_encode( array(&#39;return_code&#39; => &#39;FAIL&#39;, &#39;return_msg&#39; => &#39;transfers_接口出错&#39;, &#39;return_ext&#39; => array()) );
        }
    }
}
発生する可能性のある問題:

1. CA 証明書エラー

WxMchPay でわかるように、SDK の Wxpay_client_pub を書き換えました。 postXmlSSLCurl() メソッド

は、SDK のこのメソッドには、CURL

POST リクエスト

を作成するときにデフォルトで CA 証明書が付属しないためです。

それに比べて、

curl_setopt($ch,CURLOPT_CAINFO, WxPayConf_pub::SSLROOTCA_PATH); このようなコード行がたくさんあります。

リクエスト時にCA証明書を添付する機能です。

2. 同じユーザーの転送操作が頻繁すぎるため、後でもう一度お試しください。

このエラーはWeChatサーバーの制限に属しますが、具体的な頻度制限については説明されていません。実際のテストは約1分程度です。

だから、開発するときはもっと注意する必要があります。 [関連する推奨事項]

1.

WeChat パブリックアカウントプラットフォームのソースコードのダウンロード

2.

WeChat 投票のソースコードの無料ダウンロード

以上が小規模プログラム開発に対する企業向け支払いの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。