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);
}

原文地址:https://www.cnblogs.com/xiaolupin/p/9036264.html

时间: 2024-10-12 04:52:51

H5微信支付的相关文章

H5微信支付流程

1,.在微信支付平台配置域名为支付页面的目录 比如支付页面 a.aaa.com/pay/pay.com 设置域名 a.aaa.com/pay/ 2.点击下单时候请求后台服务器,后台会去请求微信预支付订单,返回预支付订单信息res 包含appId.timeStamp.nonceStr.signType.paySign信息 3.请求微信支付 <script src="http://res.wx.qq.com/open/js/jweixin-1.0.0.js"></scri

H5+微信支付报-1问题

1.检查发起支付的参数,全部设置为小写: WxPayData jsApiParam = new WxPayData(); jsApiParam.SetValue("appid", WxPayConfig.APPID); jsApiParam.SetValue("partnerid", WxPayConfig.MCHID); jsApiParam.SetValue("prepayid", result.GetValue("prepay_i

H5版如何在微信外(非微信浏览器)进行微信支付技术方案

官方是支持在非微信内置浏览器中调起微信支付的!H5支付是基于公众号基础开发的一种非微信内浏览器支付方式(需要单独申请支付权限),可以满足在微信外的手机H5页面进行微信支付的需求.同时,由于H5链接传播十分方便.来源不易追踪,商户需要特别注意做好防钓鱼.防刷单的处理,控制风险. 流程原理 接口说明 (1)用户打开商户H5网页选购商品,生成支付订单:(2)商户调用[统一下单]接口(接口中trade_type需定义为WAP),获得预支付交易会话标识prepayid:(3)商户按照微信H5支付协议生成d

企业号微信支付 公众号支付 H5调起支付API示例代码 JSSDK C# .NET

先看效果: 1.本文演示的是微信[企业号]的H5页面微信支付 2.本项目基于开源微信框架WeiXinMPSDK开发:https://github.com/JeffreySu/WeiXinMPSDK 感谢作者苏志巍的开源精神 一.准备部分 相关参数: AppId:公众号的唯一标识(登陆微信企业号后台 - 设置 - 账号信息 - CorpID) AppSecret:(微信企业号后台 - 设置 - 权限管理 - 新建一个拥有所有应用权限的普通管理组 - Secret) Key:商户API密钥(登陆微信

基于H5的微信支付开发详解

这次总结一下用户在微信内打开网页时,可以调用微信支付完成下单功能的模块开发,也就是在微信内的H5页面通过jsApi接口实现支付功能.当然了,微信官网上的微信支付开发文档也讲解的很详细,并且有实现代码可供参考,有的朋友直接看文档就可以自己实现此支付接口的开发了. 一.前言 为何我还写一篇微信支付接口的博文呢?第一,我们必须知道,所谓的工作经验很多都是靠总结出来的,你只有总结了更多知识,积累了更多经验,你才能在该行业中脱颖而出,我个人觉得如今的招聘,很多都需要工作经验(1年.3年.5年....),其

****基于H5的微信支付开发详解[转]

这次总结一下用户在微信内打开网页时,可以调用微信支付完成下单功能的模块开发,也就是在微信内的H5页面通过jsApi接口实现支付功能.当然了,微信官网上的微信支付开发文档也讲解的很详细,并且有实现代码可供参考,有的朋友直接看文档就可以自己实现此支付接口的开发了. 一.前言 为何我还写一篇微信支付接口的博文呢?第一,我们必须知道,所谓的工作经验很多都是靠总结出来的,你只有总结了更多知识,积累了更多经验,你才能在该行业中脱颖而出,我个人觉得如今的招聘,很多都需要工作经验(1年.3年.5年....),其

微信公众号支付H5调用支付详解

最近项目需要微信支付,然后看了下微信公众号支付,,虽然不难,但是细节还是需要注意的,用了大半天时间写了个demo,并且完整的测试了一下支付流程,下面分享一下微信公众号支付的经验. 一.配置公众号微信支付 需要我们配置微信公众号支付地址和测试白名单. 比如:支付JS页面的地址为 http://www.xxx.com/shop/pay/ 那此处配置www.xxx.com/shop/pay/ 二.开发流程 借用微信公众号支付api(地址 http://pay.weixin.qq.com/wiki/do

微信公众号内H5调用微信支付国内服务商模式

最近在折微信公众号内H5用JSAPI调用微信支付,境内服务商版支付,微信支付给出的官方文档以及SDK不够详细,导至我们走了一些弯路,把他分享出来,我这边主要是用PHP开发,所以未加说的话示例都是PHP代码 微信的官方文档  https://pay.weixin.qq.com/wiki/doc/api/jsapi_sl.php?chapter=7_1 1.服务商模式下调用统一下单 独立商户模式统一下单:https://pay.weixin.qq.com/wiki/doc/api/jsapi.php

微信支付h5客户端开发步骤

第一步:用户同意授权,获取code 在确保微信公众账号拥有授权作用域(scope参数)的权限的前提下 服务号获得高级接口后,默认拥有scope参数中的snsapi_base和snsapi_userinfo),引导关注者打开如下页面: https://open.weixin.qq.com/connect/oauth2/authorize?appid=APPID&redirect_uri=REDIRECT_URI&response_type=code&scope=SCOPE&s