微信小程序支付 后端PHP(二)

近期改了下PHP代码:

<?php
/**
 * Created by PhpStorm.
 * User: UFO
 * Date: 17/8/21
 * Time: 下午3:16
 * 参考链接:https://pay.weixin.qq.com/wiki/doc/api/wxa/wxa_api.php?chapter=9_1&index=1
 */
require_once "WxPay.ConfigPro.php";
class WxmPayPro  {

     function wx_getPayRequest( $mid, $openid, $orderid, $rmb, $title, $body, $type='1' )
    {

        $tradeid = $mid.$type;//订单号,这个根据自己需求自定义, mid是支付订单里第三方也就是商户我自己的业务逻辑,不写也可以
        $nonce   = $orderid.mt_rand(10000,99999);
        $notify  = 'http://'.Plat_Const::getApiHost().'/pay/miniwxpage.php';//回调地址,自己写,支付成功回调,在回调页面进行更改与用户金钱相关的代码
        $url     = 'https://api.mch.weixin.qq.com/pay/unifiedorder';
        // post data
        $now  = time().'';//时间
        $appid = Plat_PayFunc::getMiniWxSecret( $millid, 'appid' );//小程序ID 写到一个类里面了 方便后期修改 当然也可以在这里直接写
        $mchid = Plat_PayFunc::getMiniWxSecret( $millid, 'mchid' );//商户号 
        $data = array(
            'appid'            => $appid,
            'mch_id'           => $mchid,
            'spbill_create_ip' => CBase_Ip::getLocalIp(),//终端ip   Y
            'nonce_str'        => $nonce,                //随机字符串Y
            'openid'           => $openid,               //用户标识 N
            'body'             => $title,                //商品描述 Y
         // 'detail'           => $body,                 //商品详情 N
            'attach'           => $tradeid,              //附加数据 N
            'out_trade_no'     => $tradeid,              //商户订单号 Y
            'total_fee'        => $rmb,                  //总金额 单位分 int Y
            'notify_url'       => $notify,               //通知地址 Y
            'trade_type'       => 'JSAPI',
        );
  
        $data[ 'sign' ] = self::wx_getPkgSign($millid, $data);
        $ret  = Plat_Net::post( $url, self::wx_toXml($data) );//自己写的网络请求类,这里也可以用其他网络请求
        $json = self::wx_parseXML( $ret );
        if( !$json || !isset($json[ 'prepay_id' ]) )
        {
            return array( 'ret' => 'fail', 'tip' => $json[ 'return_msg' ] );
        }

        // prepare for client
        $prepayid = $json[ 'prepay_id' ];
        $req = array(
            'appId'     => $appid,
            'timeStamp' => $now,
            'nonceStr'  => $nonce,
            'package'   => 'prepay_id='.$prepayid,
            'signType'  => 'MD5',
        );
        $req[ 'paySign' ] = self::wx_getPkgSign( $millid, $req );
        return json_encode($req);
    }

    public function wx_getPkgSign( $millid, $req )
    {
        $pars = '';
        ksort( $req );
        foreach( $req as $k => $v )
        {
            if( 'sign' != $k && $v !== '' )
            {
                $pars .= $k . '=' . $v . '&';
            }
        }
        $mkey = Plat_PayFunc::getMiniWxSecret( $millid, 'key' );
        $pars .= 'key='. $mkey;
        return strtoupper( md5($pars) );
    }

    public  function wx_toXML( $data )
    {
        $xml = '<xml>';
        foreach( $data as $key => $val )
        {
            $xml .= '<' . $key . '><![CDATA[' . $val . ']]></' . $key . '>';
        }
        $xml .= '</xml>';
        return $xml;
    }

    public  function wx_parseXML( $str )
    {
        $rsp = array();
        $xml = @simplexml_load_string( $str );
        if( $xml && $xml->children() )
        {
            foreach( $xml->children() as $node )
            {
                if( $node->children() )
                {
                    $k = $node->getName();
                    $nodeXml = $node->asXML();
                    $v = substr( $nodeXml, strlen($k)+2, strlen($nodeXml)-2*strlen($k)-5 );
                }
                else
                {
                    $k = $node->getName();
                    $v = (string)$node;
                }
                $rsp[ $k ] = $v;
            }
        }
        return $rsp;
    }
}

?>
然后调用:

 $data   = WxmPayPro::wx_getPayRequest( $mid, $openid, $orderid, $prmb, $title, $body, '1' );
 data即为小程序前端支付所需数据



猜你喜欢

转载自blog.csdn.net/UFO00001/article/details/78061608