H5微信支付
Posted xiaolupin
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了H5微信支付相关的知识,希望对你有一定的参考价值。
h5支付就是纯手机浏览器调起微信支付,跟微信公众号和微信浏览器是没有关系的
下面附上步骤,
1.在微信商户平台申请H5支付
2.然后调用这个H5接口,必须的参数如下
//在微信开放平台中的
$appid = "wxf1f965af5c26f7f";
$AppSecret = "306d3e8f126b1b840fcce6ac6a516re3";
//在微信商户平台中的
$mch_id = "1497359772"; //商户号,在商户平台中查看
$key=00fBubLbb0kg9ub9fH13By31s2rlxHRS"; //商户支付密钥
3.下面附上代码
//调取微信支付
public function index(){
$order_id = I(‘order_id/d‘,0); // 订单id
$master_order_sn = I(‘master_order_sn‘,‘‘);// 多单付款的 主单号
// 如果是主订单号过来的, 说明可能是合并付款的
if($master_order_sn)
{
M(‘order‘)->where("master_order_sn",$master_order_sn)->save(array(‘pay_code‘=>‘weixin‘,‘pay_name‘=>‘H5微信支付‘));
$order = M(‘order‘)->where("master_order_sn",$master_order_sn)->find();
$order[‘order_sn‘] = $master_order_sn; // 临时修改 给支付宝那边去支付
$order[‘order_amount‘] = M(‘order‘)->where("master_order_sn",$master_order_sn)->sum(‘order_amount‘); // 临时修改 给支付宝那边去支付
}else{
M(‘order‘)->where("order_id" , $order_id)->save(array(‘pay_code‘=>‘weixin‘,‘pay_name‘=>‘H5微信支付‘));
$order = M(‘order‘)->where("order_id" , $order_id)->find();
}
if($order[‘pay_status‘] == 1){
$this->error(‘此订单,已完成支付!‘);
}
// 文档中说的,价格 单位是分
$money = $order[‘order_amount‘]*100; //商品价格
// 前台请求的参数
$title = "致礼商城";
$userid = $order[‘user_id‘];
$time = time();
$nonce_str = "hcuasduvihasdiovjerjgvujsaru"; //随机字符串
$appid = "wxf1f965agdc26f67f"; //在微信开放平台中的 appid(先要创建一个移动应用)
$mch_id = "1497857772"; //商户号,在商户平台中查看
$key = "306d3e8f126b16hi0fcce6ac6a51617b"; //在微信开放平台中的 AppSecret
$notify_url = "http://www.goods.com/index.php/Mobile/Payment2/callbackUrl"; //用户支付完后微信会来触发这个脚本,是处理业务逻辑的地方
//订单号可以灵活使用,比如我这个地方把userid加进去,在异步回调的时候方便直接操作用户
$out_trade_no = $order[‘order_sn‘]; //支付成功微信返回订单号
// 下面的参数含义直接看文档
$tmpArr = array(
‘appid‘=>$appid, //不要填成了 公众号原始id
‘attach‘=>$title,
‘body‘=>$title,
‘mch_id‘=>$mch_id,
‘nonce_str‘=>$nonce_str,
‘notify_url‘=>$notify_url,
‘out_trade_no‘=>$out_trade_no,
‘spbill_create_ip‘=>$this->ip(),
‘total_fee‘=>$money,
‘trade_type‘=>‘MWEB‘
);
// 签名逻辑官网有说明,签名步骤就不解释了
ksort($tmpArr);
$buff = "";
foreach ($tmpArr as $k => $v)
{
$buff .= $k . "=" . $v . "&";
}
$buff = trim($buff, "&");
$stringSignTemp=$buff."&key=00fBubLbbqe570bJxH13By31s2rlxHRS"; //商户支付密钥
$sign= strtoupper(md5($stringSignTemp)); //签名
$xml = "<xml>
<appid>".$appid."</appid>
<attach>".$title."</attach>
<body>".$title."</body>
<mch_id>".$mch_id."</mch_id>
<nonce_str>".$nonce_str."</nonce_str>
<notify_url>".$notify_url."</notify_url>
<out_trade_no>".$out_trade_no."</out_trade_no>
<spbill_create_ip>".$this->ip()."</spbill_create_ip>
<total_fee>".$money."</total_fee>
<trade_type>MWEB</trade_type>
<sign>".$sign."</sign>
</xml> ";
$posturl = "https://api.mch.weixin.qq.com/pay/unifiedorder";
$ch = curl_init($posturl);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_POST, 1);
curl_setopt($ch, CURLOPT_POSTFIELDS, $xml);
$response = curl_exec($ch);
curl_close($ch);
$xmlobj = json_decode(json_encode(simplexml_load_string($response, ‘SimpleXMLElement‘, LIBXML_NOCDATA )));
// dump($xmlobj);die;
$wurl = $xmlobj->mweb_url;
echo "<script>location.href=‘".$wurl."‘</script>";
}
//获取客户端IP
function ip() {
if(getenv(‘HTTP_CLIENT_IP‘) && strcasecmp(getenv(‘HTTP_CLIENT_IP‘), ‘unknown‘)) {
$ip = getenv(‘HTTP_CLIENT_IP‘);
} elseif(getenv(‘HTTP_X_FORWARDED_FOR‘) && strcasecmp(getenv(‘HTTP_X_FORWARDED_FOR‘), ‘unknown‘)) {
$ip = getenv(‘HTTP_X_FORWARDED_FOR‘);
} elseif(getenv(‘REMOTE_ADDR‘) && strcasecmp(getenv(‘REMOTE_ADDR‘), ‘unknown‘)) {
$ip = getenv(‘REMOTE_ADDR‘);
} elseif(isset($_SERVER[‘REMOTE_ADDR‘]) && $_SERVER[‘REMOTE_ADDR‘] && strcasecmp($_SERVER[‘REMOTE_ADDR‘], ‘unknown‘)) {
$ip = $_SERVER[‘REMOTE_ADDR‘];
}
return preg_match ( ‘/[\d\.]{7,15}/‘, $ip, $matches ) ? $matches [0] : ‘‘;
}
//调取微信回掉
public function callbackUrl(){
// 本脚本的业务逻辑只是个例子,仅供参考
// 拿到原始数据并通过xml类解析为对象
$postObj = simplexml_load_string(file_get_contents("php://input"), ‘SimpleXMLElement‘, LIBXML_NOCDATA );
// 你可以通过下面这种方式来看一下微信究竟返回了那些参数,请保证log.php存在并且有写权限
// file_put_contents("/log.php",file_get_contents("php://input"));
// file_put_contents(__DIR__. ‘/joijijlklj.txt‘, file_get_contents("php://input"));
// file_put_contents(dirname(__file__)."/log.php",file_get_contents("php://input"));
$arr = array();
foreach ($postObj as $key => $value) {
$arr[$key] = $value;
}
// 订单状态
$status = $arr[‘result_code‘];
if(trim($status) == "SUCCESS") {
// 微信订单
$transaction_id = $arr[‘transaction_id‘];
// 价格
$money = $arr[‘total_fee‘]/100;
// 在商户订单号中提取用户id,上一个脚本中我说了这个商户订单号可以灵活使用
$order_sn = $arr[‘out_trade_no‘];
// file_put_contents(__DIR__. ‘/lplplplplplplp.txt‘, $transaction_id.‘---‘.$order_sn);
// 在数据库中检查这个订单号是否已经处理过了 以免重复处理,因为很多原因微信可能多次触发本脚本
// checkrepeat(orderid);
$this->chuli($order_sn,$transaction_id);
// 处理完逻辑 返回这个xml数据,告诉微信服务器,这个订单号已经处理完了 不要在来骚扰我了
$xml = "
<xml>
<return_code><![CDATA[".$status."]]></return_code>
<return_msg><![CDATA[OK]]></return_msg>
</xml>";
echo $xml;
}
}
//处理业务逻辑
public function chuli($order_sn,$transaction_id){
// 先查看一下 是不是 合并支付的主订单号
$order_list = M(‘order‘)->where("master_order_sn", $order_sn)->select();
if ($order_list) {
foreach ($order_list as $key => $val)
update_pay_status($val[‘order_sn‘], $transaction_id);
return;
}
// 如果这笔订单已经处理过了
$count = M(‘order‘)->master()->where([‘order_sn‘ => $order_sn, ‘pay_status‘ => 0])->count(); // 看看有没已经处理过这笔订单 支付宝返回不重复处理操作
if ($count == 0)
return false;
// 找出对应的订单
$order = M(‘order‘)->master()->where("order_sn", $order_sn)->find();
$order1 = M(‘order‘)->where("order_sn", $order_sn)->find();
$order2 = M(‘users‘)->where("user_id", $order[‘user_id‘])->find();
// 修改支付状态 已支付
M(‘order‘)->where("order_sn", $order_sn)->save(array(‘pay_status‘ => 1, ‘pay_time‘ => time(), ‘transaction_id‘ => $transaction_id));
//-------------------支付成功后才 减余额 和清空购物车----------------------------------------------------------
// 3 扣除余额
$save_moneys = $order2[‘user_money‘]-$order[‘user_money‘];
// dump($save_moneys);die;
M(‘users‘)->where([‘user_id‘=>$order[‘user_id‘]])->save([‘user_money‘=>$save_moneys]); // 用户的余额减
// 4 清空购物车 不是企业采购
// "user_id = $order[‘user_id‘] and selected = 1 and prom_type != 4"
M(‘cart‘)->where([‘user_id‘=>$order[‘user_id‘],‘selected‘=>1])->delete();
// 减少对应商品的库存
minus_stock($order);
// 给他升级, 根据order表查看消费记录 给他会员等级升级 修改他的折扣 和 总金额
update_user_level($order[‘user_id‘]);
// 记录订单操作日志
logOrder($order[‘order_id‘], ‘订单付款成功‘, ‘付款成功‘, $order[‘user_id‘], 2);
//分销设置
M(‘rebate_log‘)->where("order_id", $order[‘order_id‘])->save(array(‘status‘ => 1));
// 成为分销商条件
//$distribut_condition = tpCache(‘distribut.condition‘);
//if($distribut_condition == 1) // 购买商品付款才可以成为分销商
//M(‘users‘)->where("user_id = {$order[‘user_id‘]}")->save(array(‘is_distribut‘=>1));
// 给商家待结款字段加上
$order_settlement = order_settlement($order[‘order_id‘]);
M(‘store‘)->where("store_id", $order[‘store_id‘])->setInc(‘pending_money‘, $order_settlement[0][‘store_settlement‘]); // 店铺 待结算资金 累加
//虚拟服务类商品支付
if ($order[‘order_prom_type‘] == 5) {
make_virtual_code($order);
}
// 赠送积分
order_give($order); // 调用送礼物方法, 给下单这个人赠送相应的礼物
//用户支付, 发送短信给商家
$res = checkEnableSendSms("4");
if (!$res || $res[‘status‘] != 1)
return;
$store = M(‘store‘)->where("store_id", $order[‘store_id‘])->find();
if (empty($store[‘service_phone‘]))
return;
$sender = $store[‘service_phone‘];
$params = array(‘order_sn‘ => $order_sn);
sendSms("4", $sender, $params);
}
以上是关于H5微信支付的主要内容,如果未能解决你的问题,请参考以下文章