1,申请流程
APP支付和微信公众号支付区别如下:
不同参数:
appid
:APP支付(开放平台ID)、JSAPI支付(公众号ID);
appsecret
:APP支付(开放平台秘钥)、JSAPI支付(公众号秘钥);
trade_type
:APP支付(APP)、JSAPI支付(JSAPI);
openid
:JSAPI支付必传此参数;
首先必须通知客户先申请商户号以及微信开放平台,然后认证。
微信开放平台
:https://open.weixin.qq.com/
微信商户号
:https://pay.weixin.qq.com/index.php/core/home/login?return_url=%2F
2,微信配置
说明:
APPID
微信开放平台的APPID
MCHID
商户号
KEY
商户支付密钥
APPSECRET
微信开放平台的秘钥
3,商户支付密钥生成
密钥由自己生成,推荐使用在线密码生成器。(32位字符串)
4,SDK开发者后台接入
在开始后台代码前,我们必须有4个参数,APPID
、商户号
、商户支付密钥
、微信开放平台的秘钥
。 没有这4个参数,就没法唤起微信支付接口!!!
准备好后可以下载微信的官方demo代码参考。https://pay.weixin.qq.com/wiki/doc/api/app/app.php?chapter=11_1
[图片上传失败...(image-99294-1595316836475)]
5,核心步骤代码(微信APP支付)
说明:前端调用的方法
/*********************************微信支付*********************************/
// 接收前端的参数,这里省略
$data = [];
$data['user_id'] = $_REQUEST['userId'];
$data['level'] = $_REQUEST['level'];
// $data['order_money'] =abs($_REQUEST['orderMoney'])+0;
$data['order_money'] = 0.01; // 测试0.01元
$data['pay_type'] = $_REQUEST['payType'] == 1 ?'wxpay':'2';
if($data['pay_type'] == 2){
echo "<script>alert('请用微信支付')</script>";
die;
}
$data['goods_type'] = $_REQUEST['goodsType'];
// $data['REMOTE_ADDR'] = $_SERVER['REMOTE_ADDR'];
// 添加入库订单
$sql = "select name,parent_id from users where client_id=".$data['user_id'];
$result = $model->get_one($sql);
if($result['parent_id']){
$data['parent_id'] = $result['parent_id'];
}else{
$data['parent_id'] = 0;
}
// 生成平台订单号
$data['order_num'] = creation_order();
$data['product_name'] = '充值';
$data['create_time']=date('Y-m-d H:i:s');
$check = $model->insert('game_order',$data);
if($check){
$notify_url = "http://47.94.40.238/hjwyx/order_pay/pay2/notify.php"; // 异步通知地址
$res = start_pay($data,$notify_url); // 同步请求地址
//return $res;
echo json_encode($res);die;
}else{
exit('下单失败,请检查原因');
}
/**********************************************************/
}else{
exit("未接收到参数");
}
说明:start_pay方法
function start_pay($param,$notify_url)
{
$order =[];
//微信支付的金额基本单位是分,所以需要乘于100.客户传输过来的金额单位是元
$price=bcmul($param['order_money'], 100);
// $price = (int)(($param['order_money']+0.00001)*100);
if($price <= 0 ){
echo "<script>alert('订单金额错误')</script>";
die;
}
$input = new WxPayUnifiedOrder();
$input->SetAppid(WxPayConfig::APPID);
//充值内容
$input->SetBody($param['product_name']);
//订单号
$input->SetOut_trade_no($param['order_num']);
//订单总金额
$input->SetTotal_fee($price);
// 设置订单生成时间
$input->SetTime_start(date("YmdHis"));
// 设置订单失效时间
$input->SetTime_expire(date("YmdHis", time() + 3600));
// 设置接收微信支付异步通知回调地址
$input->SetNotify_url($notify_url);
$input->SetTrade_type("APP");
//生成prepay_id字符串
try {
$order = WxPayApi::unifiedOrder($input);
if(!array_key_exists("appid", $order) || !array_key_exists("prepay_id", $order) || $order['prepay_id'] == ""){
return array('err_code'=>500,'err_msg'=>''.$order['return_msg']);
}
} catch (Exception $e) {
return array('err_code'=>500,'err_msg'=>$e->getMessage());
}
//
$time = time();
$t = array('appid'=>WxPayConfig::APPID,'partnerid'=>WxPayConfig::MCHID,'prepayid'=>$order['prepay_id'],'package'=>'Sign=WXPay','noncestr'=>$param['order_num'],'timestamp'=>$time);
ksort($t);
$str = '';
foreach ($t as $k => $v)
{
if($v != ""){
$str .= $k . "=" . $v . "&";
}
}
$str = trim($str, "&");
$str = $str . '&key=' .WxPayConfig::KEY;
$sign = strtoupper(md5($str));
$t['err_code'] = 0;
$t['err_msg'] = 'success';
$t['sign'] = $sign;
return $t;
}
说明:异步回调方法
public function notify()
{
$testxml = file_get_contents("php://input");
$jsonxml = json_encode(simplexml_load_string($testxml, 'SimpleXMLElement', LIBXML_NOCDATA));
$result = json_decode($jsonxml, true);//转成数组,
file_put_contents("notify_data.txt", json_encode($result));
if($result){
// 判断返回码,返回状态码是否存在
if($result['return_code'] == 'SUCCESS' && $result['result_code'] == 'SUCCESS'){
// 开始处理业务逻辑
}
} else{
// $model->update('game_order', ['order_status'=>300],"order_num='$order_no'");
echo '支付失败';
die;
}
}