APP微信支付报错《商户号该产品权限未开通,请前往商户平台>产品中心检查后重试》
问题已解决,开放平台微信认证申请的微信app支付是有一个独立的商户平台 ,这个商户平台与公众号申请支付开通的商户平台是不共用的 ,也就是appid和商户号这些参数是不一样的!!
还有一个就是公众号支付和app支付对应的商户平台是不一样的,在商户平台切换账号处可以查看(一个商户id对应一个商户平台账号)
spbill_create_ip 订单生成的机器IP
参数 spbill_create_ip 在 /lib/WxPay.Api.php 的53行
打印出变量
$_SERVER
[
'REMOTE_ADDR'
] ,发现是 ::1 ,这明显是一个无效的ip地址
你应该是在本地进行测试开发的,你只需要把你的本地 localhost 解析为 公网的ip就可以了,
因为微信支付需要有回调url,所以没法确定你的公网ip就没法发送订单支付通知给你,所以提供一个
解析的正常ip就好
问题已解决,开放平台微信认证申请的微信app支付是有一个独立的商户平台 ,这个商户平台与公众号申请支付开通的商户平台是不共用的 ,也就是appid和商户号这些参数是不一样的!!
还有一个就是公众号支付和app支付对应的商户平台是不一样的,在商户平台切换账号处可以查看(一个商户id对应一个商户平台账号)
public function index() {
$order = [
'appid'=>'123456',
'mch_id'=>'56789',
'nonce_str'=>uniqid(md5(time())),
'body'=>'测试商品',
'out_trade_no'=>87654321,//商户唯一订单号,可包含字母序
'total_fee'=>100,//订单金额,单位/分
'spbill_create_ip'=>'123.12.12.123',//产生订单号的服务器IP
'notify_url'=>'http://www.yoursite.com/wxpay',//接受微信异步通知地址
'trade_type'=>'APP'
];
//用户http_build_query()将数据转成URL键值对形式
$sign = http_build_query($order);
//$sign = "appid=123456&mch_id=56789&nonce_str=c6079b98e6aeb4a98f687800c887f6cc58df95d72cd69&body=%E6%B5%8B%E8%AF%95%E5%95%86%E5%93%81&out_trade_no=87654321&total_fee=100&spbill_create_ip=123.12.12.123¬ify_url=http%3A%2F%2Fwww.yoursite.com%2Fwxpay&trade_type=APP";
//MD5处理,默认支持MD5
$sign = md5($sign);
//转大写
$sign = strtoupper($sign);
$order['sign'] = $sign;
//转换成一维XML格式
$xml = '';
foreach($order as $k=>$v){
$xml.='<'.$k.'>'.$k.'>';
}
$xml.=' ';
//CURL会话
$ch = curl_init();
// 设置curl允许执行的最长秒数
curl_setopt($ch, CURLOPT_TIMEOUT, 3);
curl_setopt($ch,CURLOPT_SSL_VERIFYPEER,false);
curl_setopt($ch,CURLOPT_SSL_VERIFYHOST,false);
// 获取的信息以文件流的形式返回,而不是直接输出。
curl_setopt($ch, CURLOPT_RETURNTRANSFER,1);
//发送一个常规的POST请求。
curl_setopt($ch, CURLOPT_POST, 1);
curl_setopt($ch, CURLOPT_URL, 'https://api.mch.weixin.qq.com/pay/unifiedorder');
//要传送的所有数据
curl_setopt($ch, CURLOPT_POSTFIELDS, $order);
// 执行操作
$response = curl_exec($ch);
//将xml格式的$response 转成数组
$response = json_decode( json_encode( simplexml_load_string($response, 'SimpleXMLElement', LIBXML_NOCDATA) ), true );
//若预下单成功,return_code 和result_code为SUCCESS。
if ( $response['return_code'] ==='SUCCESS' && $response['result_code'] ==='SUCCESS') {
//返回trade_type和prepay_id供前端调用
echo json_encode( ['trade_type'=>$response['trade_type'], 'prepay_id'=>$response['prepay_id']] );
}
}
public function notify()
{
$xml = file_get_contents('php://input');
$arr = json_decode(json_encode(simplexml_load_string($xml, 'SimpleXMLElement', LIBXML_NOCDATA)), true);
//用户http_build_query()将数据转成URL键值对形式
$sign = http_build_query($arr);
//md5处理
$sign = md5($sign);
//转大写
$sign = strtoupper($sign);
//验签名。默认支持MD5
if ( $sign === $arr['sign']) {
// 校验返回的订单金额是否与商户侧的订单金额一致。修改订单表中的支付状态。
}
$return = ['return_code'=>'SUCCESS','return_msg'=>'OK'];
$xml = '';
foreach($return as $k=>$v){
$xml.='<'.$k.'>'.$k.'>';
}
$xml.=' ';
echo $xml;
}
问题已解决,开放平台微信认证申请的微信app支付是有一个独立的商户平台 ,这个商户平台与公众号申请支付开通的商户平台是不共用的 ,也就是appid和商户号这些参数是不一样的!!
还有一个就是公众号支付和app支付对应的商户平台是不一样的,在商户平台切换账号处可以查看(一个商户id对应一个商户平台账号)