微信支付商户平台: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)); } }