微信公共号H5支付。

1、接受支付信息。

/**
* 发起支付请求
* @return [type] [description]
*/
function pay($openid){
$nonce_str = $this->rand_code(); //调用随机字符串生成方法获取随机字符串
$data[‘appid‘] = $this->appid; //appid
$data[‘mch_id‘] = $this->mch_id ; //商户号
$data[‘body‘] = ‘ceshi‘;
$data[‘spbill_create_ip‘] = $_SERVER["REMOTE_ADDR"]; //ip地址
$data[‘total_fee‘] = 10; //金额 默认金额:分 *100
$data[‘out_trade_no‘] = time().mt_rand(10000,99999); //商户订单号,不能重复
$data[‘nonce_str‘] = $nonce_str; //随机字符串
$data[‘notify_url‘] = 支付回调地址(自己填写); //回调地址,用户接收支付后的通知,必须为能直接访问的网址,不能跟参数
$data[‘trade_type‘] = ‘JSAPI‘; //支付方式
$data[‘openid‘] = $openid; //openid
//将参与签名的数据保存到数组 注意:以上几个参数是追加到$data中的,$data中应该同时包含开发文档中要求必填的剔除sign以外的所有数据
$data[‘sign‘] = $this->getSign($data); //获取签名
$xml = $this->ToXml($data); //数组转xml
//curl 传递给微信方
$url = "https://api.mch.weixin.qq.com/pay/unifiedorder";
// header("Content-type:text/xml");
$ch = curl_init();
curl_setopt($ch,CURLOPT_URL, $url);
if(stripos($url,"https://")!==FALSE){
curl_setopt($ch, CURLOPT_SSLVERSION, 1);
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, FALSE);
curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, FALSE);
} else {
curl_setopt($ch,CURLOPT_SSL_VERIFYPEER,TRUE);
curl_setopt($ch,CURLOPT_SSL_VERIFYHOST,2);//严格校验
}
//设置header
curl_setopt($ch, CURLOPT_SSLVERSION, 1);
curl_setopt($ch, CURLOPT_HEADER, FALSE);
//要求结果为字符串且输出到屏幕上
curl_setopt($ch, CURLOPT_RETURNTRANSFER, TRUE);
//设置超时
curl_setopt($ch, CURLOPT_TIMEOUT, 30);
curl_setopt($ch, CURLOPT_POST, TRUE);
//传输文件
curl_setopt($ch, CURLOPT_POSTFIELDS, $xml);
//运行curl
$data = curl_exec($ch);
//返回结果
if($data)
{
curl_close($ch);
//返回成功,将xml数据转换为数组.
$re = $this->FromXml($data);
if($re[‘return_code‘] != ‘SUCCESS‘)
{
return "201";
}
else
{
/*二次签名*/
$arr =[
‘appId‘ =>$re[‘appid‘],
‘package‘ => ‘prepay_id=‘.$re[‘prepay_id‘],
‘nonceStr‘ => $this->rand_code(),
‘signType‘ => ‘MD5‘,
‘timeStamp‘ => time(),
];
//第二次生成签名
$arr[‘paySign‘] = $this->getSign($arr);
return $arr;
}
}
else
{
$error = curl_errno($ch);
curl_close($ch);
return ‘201 curl ‘.$error;
}
}

// 生成签名
function getSign($params)
{
ksort($params); //将参数数组按照参数名ASCII码从小到大排序
foreach ($params as $key => $item)
{
if (!empty($item))
{ //剔除参数值为空的参数
$newArr[] = $key.‘=‘.$item; // 整合新的参数数组
}
}
$stringA = implode("&", $newArr); //使用 & 符号连接参数
$stringSignTemp = $stringA."&key=".$this->key; //拼接key
// key是在商户平台API安全里自己设置的
$stringSignTemp = MD5($stringSignTemp); //将字符串进行MD5加密
$sign = strtoupper($stringSignTemp); //将所有字符转换为大写
return $sign;
}

// 生成随机字符串
function rand_code()
{
$str = ‘0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ‘;//62个字符
$str = str_shuffle($str);
$str = substr($str,0,32);
return $str;
}

// 数组转化为xml
function ToXml($data=array())
{
// print_r($data);die;
if(!is_array($data) || count($data) <= 0)
{
return ‘数组异常‘;
}
$xml = "<xml>";
foreach ($data as $key=>$val){
if(is_array($val)){
$xml.="<".$key.">".arrayToXml($val)."</".$key.">";
}else{
$xml.="<".$key.">".$val."</".$key.">";
}
}
$xml.="</xml>";
return $xml;
}

// 将xml数据转换为数组
function FromXml($xml){
if(!$xml){
echo "xml数据异常!";
}
//将XML转为array
//禁止引用外部xml实体
libxml_disable_entity_loader(true);
$data = json_decode(json_encode(simplexml_load_string($xml, ‘SimpleXMLElement‘, LIBXML_NOCDATA)), true);
return $data;
}

2、返回H5页面w.config数据。

public function actionWxpay(){

$model = new Indexs;
$arr = $model->pay();

$token = $model->getToken();
$url = "https://api.weixin.qq.com/cgi-bin/ticket/getticket?access_token=$token&type=jsapi";
$ticket = file_get_contents($url);
$ticket = json_decode($ticket,true);
$noncestr = $model->rand_code();
$time = time();
$url = ‘http://‘.$_SERVER[‘HTTP_HOST‘].$_SERVER[‘REQUEST_URI‘];
$arrs = [
"noncestr" => $noncestr,
"jsapi_ticket" => $ticket["ticket"],
"timestamp" => $time,
"url" => $url
];
ksort($arrs);
$str = "";
foreach ($arrs as $key => $value) {
$str .= $key."=".$value."&";
}
$str = rtrim($str,"&");
$sign = sha1($str);
$data[‘appid‘] = $this->appid;
$data[‘time‘] = $time;
$data[‘noncestr‘] = $noncestr;
$data[‘sign‘] = $sign;
return $this->renderpartial(‘wxpay‘,[‘arr’=>$arr,‘data‘=>$data]);
}

3、wxpay.php页面操作。

<script type="text/javascript">
wx.config({
debug: false, // 开启调试模式,调用的所有api的返回值会在客户端alert出来,若要查看传入的参数,可以在pc端打开,参数信息会通过log打出,仅在pc端时才会打印。
appId: "<?=$data[‘appid‘]?>", // 必填,公众号的唯一标识
timeStamp: <?=$data[‘time‘]?>, // 必填,生成签名的时间戳
nonceStr: "<?=$data[‘noncestr‘]?>", // 必填,生成签名的随机串
signature: "<?=$data[‘sign‘]?>",// 必填,签名
jsApiList: [
"checkJsApi"
// "chooseWXPay"
] // 必填,需要使用的JS接口列表"chooseWXPay",
});
wx.ready(function(){
// config信息验证后会执行ready方法,所有接口调用都必须在config接口获得结果之后,config是一个客户端的异步操作,所以如果需要在页面加载时就调用相关接口,则须把相关接口放在ready函数中调用来确保正确执行。对于用户触发时才调用的接口,则可以直接调用,不需要放在ready函数中。
wx.checkJsApi({
jsApiList: ["chooseWXPay"], // 需要检测的JS接口列表,所有JS接口列表见附录2,
success: function(res) {
// // 以键值对的形式返回,可用的api值true,不可用为false
// // 如:{"checkResult":{"chooseImage":true},"errMsg":"checkJsApi:ok"}
}
});
wx.chooseWXPay({
timestamp: <?=$arr[‘timeStamp‘]?>, // 支付签名时间戳,注意微信jssdk中的所有使用timestamp字段均为小写。但最新版的支付后台生成签名使用的timeStamp字段名需大写其中的S字符
nonceStr: "<?=$arr[‘nonceStr‘]?>", // 支付签名随机串,不长于 32 位
package: "<?=$arr[‘package‘]?>", // 统一支付接口返回的prepay_id参数值,提交格式如:prepay_id=\*\*\*)
signType: "<?=$arr[‘signType‘]?>", // 签名方式,默认为‘SHA1‘,使用新版支付需传入‘MD5‘
paySign: "<?=$arr[‘paySign‘]?>", // 支付签名
success: function (res) {
/*支付成功*/
},
cancel: function(res){
/*支付取消*/
},
fail: function(res){
/*支付失败*/
}
});
});
wx.error(function(res){
// config信息验证失败会执行error函数,如签名过期导致验证失败,具体错误信息可以打开config的debug模式查看,也可以在返回的res参数中查看,对于SPA可以在这里更新签名。
});
</script>

原文地址:https://www.cnblogs.com/yyhhblog/p/10020556.html

时间: 2024-10-09 22:10:54

微信公共号H5支付。的相关文章

微信公众号H5支付-JAVA版

微信开发之微信公众号H5支付-JAVA版 引子 从事JAVA开发一年多了,一直都在看博客园,CSDN的博客,从很多前人哪里学习了很多,突然觉得自己也要尽一份力,写点博客自己给自己做做记录,也给要开发微信人提提醒少遇点坑. 很多人开发微信的时候,总是在抱怨微信的开发文档很坑,里面的参数和使用方式很含糊,其实有时候自己想想,如果自己去研发API的时候,是否能够做的比微信更好呢?,大师都有一颗虔诚学徒的心,希望这篇文档能给予从事微信公众号H5支付焦头烂额的朋友,一点帮助. 一.前言 先给大家提提从事微

uni.app实践---微信公众号h5开发记实-----第一篇

介绍:==uni-app== 是一个使用 Vue.js 开发所有前端应用的框架,开发者编写一套代码,可编译到iOS.Android.H5.以及各种小程序(微信/阿里/百度/头条/QQ)等多个平台. uni-app官网:传送门 uni-app插件市场:传送门 前一段时间因为个人了解到这个比较nb的多端开发框架,所以有兴趣自己去尝试了一下,从开始的搭建项目到微信公众号h5的登录-->微信支付都尝试了一遍.第一次尝试也踩了很多的坑.相信有很多小伙伴也遇到过这样的疑惑和问题.(大神略过),所以在这里写下

微信公众号JSAPI支付

微信公众号JSAPI支付 一:配置参数 申请成功后,获取接口文件, 将所有文件放入项目根目录weixin下,在WxPay.ub.config.php中填入配置账户信息; 二:设置授权 开发者中心->网页服务->网页授权获取用户基本信息->修改; “授权回调页面域名修改成你的域名地址即可,须保证网页授权已获得,不然会报redirect_uri 参数错误; 三:网页授权获取用户openid js_api_call.php 请求文件中改动(所有传给微信的参数都在入口文件中接收) $out_tr

微信公共号的PHP开发(基础篇)——玩一下

最近没事儿开了个微信号,写点东西给家人啊什么的看,你们想看的话就这个嘛: 然后就意外的看到imooc上的微信公众号开发相关了.每天科研的累累的,做点这个不是很累的东西吧. 微信公共号开发 一.基础 1.1 数据交互流程 用户<————>微信服务器<————>第三方服务器: 且,由左向右都是request,由右向左都是response: 1.2 API --配置 接入API 输入这两个——所以,要事先准备好服务器,我用的是腾讯的,反正都是一家的,更方便一点吧. $timestamp=

如何抓取微信公共号的推送内容

最近业务需要,大体就是从一些相关的微信公共号来抓取每日推送的内容来. 想来想去没有什么思路,好在前几天看到搜狗可以搜索微信公共号,一看果然有戏. 这样一来就能看到该微信号完整的历史信息了.哈哈,然后果断用jsoup抓之 但是高兴的好像早了点,发现网页的渲染用的是jsonp,貌似jsoup不能执行js,然后分析了一下来源. 发现数据来自这样一个链接 http://weixin.sogou.com/gzhjs?cb=sogou.weixin.gzhcb&openid=oIWsFtz7I769OeSH

微信公众号H5游戏平台完整源码下载(几十款游戏和应用)

点击打开链接微信公众号H5游戏平台完整源码下载(几十款游戏和应用)完整打包下载,价值超高. 微信Html5游戏平台源码,包括40款h5小游戏和21款有趣的测试,大家可以直接打开浏览器本地测试. 下面展示部分效果图 11.png (149.71 KB, 下载次数: 0) 下载附件 H5游戏平台完整源码下载 3 分钟前 上传 22.png (45.41 KB, 下载次数: 0) 下载附件 H5游戏平台完整源码下载 3 分钟前 上传 33.png (115.83 KB, 下载次数: 0) 下载附件 H

本博客停止更新,请订阅“大数据在线”微信公共号

各位读者,感谢长期以来的厚爱!从即日起,大数据在线相关内容只在"大数据在线"微信公共号上更新,有兴趣的朋友可以订阅! 关于公众号 "大数据在线":中国最大的商用及企业级领域"蜂巢"自媒体联盟核心成员.专注于企业级IT技术的推广!关注请扫描下面二维码:

CabloyJS的微信API对接模块:当前支持微信公共号和微信小程序

Cabloy-微信是什么 Cabloy-微信是基于CabloyJS全栈业务开发框架开发的微信接口模块,当前整合了微信公共号和微信小程序的接口,达到开箱即用的使用效果.在Cabloy-微信的基础上,可以很方便的开发各类微信业务系统 特性 基于CabloyJS全栈框架提供的便利性和灵活性,Cabloy-微信主要有如下特性: 1. 一站式整合 当前整合了微信公共号和微信小程序的接口,具体如下: 场景 名称 说明 微信公共号 消息系统 自动完成接口对接,并自动进行用户注册 微信公共号 网页登录 自动跳转

微信公共号开发人员中心(JAVA)【token失败解决的方法】

在开发微信公共平台一些新手通常都会遇到的问题(ps:我就是那个新手) 我这里仅仅讲自己遇到的问题.遇到了token失败的问题,首先查阅资料,具体了解各个字段的具体含义,并验证代码sha1验证是否正确.看看失败的原因,依据文档提示,2个字符串假设不匹配的话,肯定是验证失败了.依据我个人想法,我是来把加密后的字符串.微信发送的字符串(signature).提取出来.来比对推断究竟是哪里错了. 我这里用的一个非常蠢的办法,就是在H盘里面生成一个,文件,文件名称各自是2个字符串.[或者写入txt文档](