关于微信支付

微信支付商户平台:http://pay.weixin.qq.com

微信支付现在分为v2版和v3版

2014年9月10号之前申请的为v2版,之后申请的为v3版。

使用V3版需要的参数

MCHID(商户号):100开头的,不是V2版122开头的

PartnerKey(初始密钥):32位随机串,在商户平台API安全中设置。

 

V2版中的参数有
AppID
AppSecret
支付专用签名串PaySignKey
商户号PartnerID
初始密钥PartnerKey

并且包含一个证书文件: 安全证书

同时,V2版需要缴纳保证金。


V3版中的参数有
AppID
AppSecret
商户号PartnerID
初始密钥PartnerKey
商户号MCHID
申请编号
商户平台登录帐号
商户平台登录密码

包含5个证书文件(证书pkcs12格式、证书pem格式、证书密钥pem格式、CA证书, 安全证书)

V3不再需要缴纳保证金。

 

如果收到的邮件中没有【支付专用签名串PaySignKey】,表示已经是V3版的微信支付了。

原V2版用户可以登陆http://pay.weixin.qq.com  商户平台升级

 

V3版使用统一订单接口

1,第一步。获取预支付ID

    /**

     * 获取预支付ID

     * @param type $openid          用户openid,JSAPI必填

     * @param type $body            商品标题

     * @param type $out_trade_no    第三方订单号

     * @param type $total_fee       订单总价

     * @param type $notify_url      支付成功回调地址

     * @param type $trade_type      支付类型JSAPI|NATIVE|APP

     * @return boolean

     */

    public function getPrepayId($openid, $body, $out_trade_no, $total_fee, $notify_url, $trade_type = "JSAPI") {

        if (!$this->access_token && !$this->checkAuth()) {

            return false;

        }

        $postdata         = array(

            "openid"           => $openid,

            "body"             => $body,

            "out_trade_no"     => $out_trade_no,

            "total_fee"        => $total_fee,

            "notify_url"       => $notify_url,

            "trade_type"       => $trade_type,

            "appid"            => $this->appid, //公众账号ID

            "mch_id"           => $this->partnerid, //商户号

            "spbill_create_ip" => get_client_ip(), //终端ip    

            "nonce_str"        => $this->generateNonceStr()

        );

        $postdata["sign"] = $this->getPaySign($postdata);

        $result           = $this->http_post(self::PAY_MCH_PAY, self::xml_encode($postdata));

        if ($result) {

            //$json = json_decode($result, true);

            $json = (array) simplexml_load_string($result, 'SimpleXMLElement', LIBXML_NOCDATA);

            if (!$json || !empty($json['errcode'])) {

                $this->errCode = $json['errcode'];

                $this->errMsg  = $json['errmsg'] . json_encode($postdata);

                return false;

            }

            return $json['prepay_id'];

        }

        return false;

    }

 

2,第二步。生成支付json串

    /**

     * 创建支付json数组

     * @param type $PrepayId

     * @return type

     */

    public function createMchPay($PrepayId) {

        $jsApiObj["appId"]     = $this->appid;

        $jsApiObj["timeStamp"] = (string) time();

        $jsApiObj["nonceStr"]  = $this->generateNonceStr();

        $jsApiObj["package"]   = "prepay_id=$PrepayId";

        $jsApiObj["signType"]  = "MD5";

        $jsApiObj["paySign"]   = $this->getPaySign($jsApiObj);

        return $jsApiObj;

    }

 

3,第三步。JS 发起支付请求

 

wx.ready(function () {

        wx.chooseWXPay({

            timestamp: data.timeStamp, // 支付签名时间戳,注意微信jssdk中的所有使用timestamp字段均为小写。但最新版的支付后台生成签名使用的timeStamp字段名需大写其中的S字符

            nonceStr: data.nonceStr, // 支付签名随机串,不长于 32 位

            package: data.package, // 统一支付接口返回的prepay_id参数值,提交格式如:prepay_id=***)

            signType: data.signType, // 签名方式,默认为'SHA1',使用新版支付需传入'MD5'

            paySign: data.paySign, // 支付签名

            success: function (res) {

                window.doing = false;

                // 支付成功后的回调函数

                top.location = "{:U('Shop/MyOrder/index')}";

            }

        });

    });

});

 

支付回调

/*** 支付回调通知* 
注:回调地址要放在无权限控制的url中*/
public function notify() {
    header('Content-Type:text/xml; charset=utf-8');
    $postStr    = file_get_contents("php://input");
    $notifyInfo = (array) simplexml_load_string($postStr, 'SimpleXMLElement', LIBXML_NOCDATA);
    if ($notifyInfo['result_code'] == 'SUCCESS' && $notifyInfo['return_code'] == 'SUCCESS') {
        // Todo:支付成功的订单详细记录数据库$return = array();
        $return['return_code'] = 'SUCCESS';
        $return['return_msg']  = '';
        exit(xml_encode($return));
    }
}

 

推荐文章

小程序开发需要多少钱?

微信开发要做哪些基础准备?

微信开发有哪些常见的功能?

选择APP还是选择微信?