付费下载
下载本文档
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
【移动应用开发技术】如何通过PHP来实现APP微信支付
这篇文章主要介绍了如何通过PHP来实现APP微信支付,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让在下带着大家一起了解一下。一、PHP后台后台生成预支付交易单,返回正确的预支付交易回话标识后再在APP里面调起支付!官方文档:/wiki/doc/api/app/app.php?chapter=9_1根据文档拼接微信需要的参数,这里需要几个方法,直接上代码!传输给微信的参数要组装成xml格式发送,传如参数数组!public
function
ToXml($data=array())
{
if(!is_array($data)
||
count($data)
<=
0)
{
return
'数组异常';
}
$xml
=
"<xml>";
foreach
($data
as
$key=>$val)
{
if
(is_numeric($val)){
$xml.="<".$key.">".$val."</".$key.">";
}else{
$xml.="<".$key."><![CDATA[".$val."]]></".$key.">";
}
}
$xml.="</xml>";
return
$xml;
}2.生成随机字符串,微信所需参数!这里方法很多,看自己爱好都行!function
rand_code(){
$str
=
'0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ';//62个字符
$str
=
str_shuffle($str);
$str
=
substr($str,0,32);
return
$str;
}3.这里是微信比较重要的一步了,这个方法会多次用到!生成签名private
function
getSign($params)
{
ksort($params);
//将参数数组按照参数名ASCII码从小到大排序
foreach
($params
as
$key
=>
$item)
{
if
(!empty($item))
{
//剔除参数值为空的参数
$newArr[]
=
$key.'='.$item;
//
整合新的参数数组
}
}
$stringA
=
implode("&",
$newArr);
//使用
&
符号连接参数
$stringSignTemp
=
$stringA."&key="."************************";
//拼接key
//
key是在商户平台API安全里自己设置的
$stringSignTemp
=
MD5($stringSignTemp);
//将字符串进行MD5加密
$sign
=
strtoupper($stringSignTemp);
//将所有字符转换为大写
return
$sign;
}4.传递参数给微信,生成预支付订单!接收微信返回的数据,在反给APP端,APP端调用支付接口,完成支付!APP端所需参数见微信文档:/wiki/doc/api/app/app.php?chapter=9_12&index=2public
function
wx_pay()
{
$nonce_str
=
$this->rand_code();
//调用随机字符串生成方法获取随机字符串
$data['appid']
='wxdbc5dc*******';
//appid
$data['mch_id']
=
'1493*****'
;
//商户号
$data['body']
=
"APP支付测试";
$data['spbill_create_ip']
=
$_SERVER['HTTP_HOST'];
//ip地址
$data['total_fee']
=
1;
//金额
$data['out_trade_no']
=
time().mt_rand(10000,99999);
//商户订单号,不能重复
$data['nonce_str']
=
$nonce_str;
//随机字符串
$data['notify_url']
=
'/wx_notify';
//回调地址,用户接收支付后的通知,必须为能直接访问的网址,不能跟参数
$data['trade_type']
=
'APP';
//支付方式
//将参与签名的数据保存到数组
注意:以上几个参数是追加到$data中的,$data中应该同时包含开发文档中要求必填的剔除sign以外的所有数据
$data['sign']
=
$this->getSign($data);
//获取签名
$xml
=
$this->ToXml($data);
//数组转xml
//curl
传递给微信方
$url
=
"/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,
CURL_SSLVERSION_TLSv1);
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,
CURL_SSLVERSION_TLSv1);
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'){
json("201",'签名失败');
}
else{
//接收微信返回的数据,传给APP!
$arr
=array(
'prepayid'
=>$re['prepay_id'],
'appid'
=>
'wxdbc5dc*****',
'partnerid'
=>
'14937****',
'package'
=>
'Sign=WXPay',
'noncestr'
=>
$nonce_str,
'timestamp'
=>time(),
);
//第二次生成签名
$sign
=
$this->getSign($arr);
$arr['sign']
=
$sign;
json('200','签名成功',$arr);
}
}
else
{
$error
=
curl_errno($ch);
curl_close($ch);
json('201',"curl出错,错误码:$error");
}
}5.将xml数据转换为数组,接收微信返回数据时用到.public
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;
}二、APP支付成功后,会调用你填写的回调地址.返回参数详见微信文档:/wiki/doc/api/app/app.php?chapter=9_7&index=3//
微信支付回调
function
wx_notify(){
//接收微信返回的数据数据,返回的xml格式
$xmlData
=
file_get_contents('php://input');
//将xml格式转换为数组
$data
=
$this->FromXml($xmlData);
//用日志记录检查数据是否接受成功,验证成功一次之后,可删除。
$file
=
fopen('./log.txt',
'a+');
fwrite($file,var_export($data,true));
//为了防止假数据,验证签名是否和返回的一样。
//记录一下,返回回来的签名,生成签名的时候,必须剔除sign字段。
$sign
=
$data['sign'];
unset($data['sign']);
if($sign
==
$this->getSign($data)){
//签名验证成功后,判断返回微信返回的
if
($data['result_code']
==
'SUCCESS')
{
//根据返回的订单号做业务逻辑
$arr
=
array(
'pay_status'
=>
1,
);
$re
=
M('order')->where(['order_sn'=>$data['out_trade_no']])->save($arr);
//处理完成之后,告诉微信成功结果!
if($re){
echo
'<xml>
<return_code><![CDATA[SUCCESS]]></return_code>
<return_msg><![CDATA[OK]]></return_msg>
</xml>';exit();
}
}
//支付失败,输出错误信息
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2027届赣州市于都县数学六上期末检测模拟试题含解析
- 2026年中国刻伤机皮带市场调查研究报告
- 公路路面工程监理实施细则
- 2026年中国划线平台市场调查研究报告
- 2026静脉知识试题及答案
- 食品安全风险日管控、周排查、月调度工作制度
- 2026年中国分摞机市场调查研究报告
- 院感防控知识培训试题及答案
- 高架桥施工方案
- 钢结构安装企业焊工日常检查安全操作规程
- 注册会计师考试2025年平台经济对会计的挑战与策略试题及答案
- 小学生班级管理培训课件
- 蔬菜采购述职报告
- 2025陕西延长石油(集团)有限责任公司招聘(1881人)笔试备考题库及答案解析
- CJT 514-2018 燃气输送用金属阀门
- 广东省深圳市罗湖区2023-2024学年八年级下学期期末考试英语试题
- 个人防护装备的使用培训
- 2024年T+产品历年考试高频考点试题附带答案
- 展厅升级改造方案
- (新版)驾照科目一必备考试题库500题(含答案)
- FLUKE1550C电子兆欧表使用介绍
评论
0/150
提交评论