php集成微信支付后台app端
(2018年5月18日测试可用)
1.进入微信商户平台查看统一下单接口文档。
在查看完统一下单文档后,能够看到需要传递给微信“统一下单接口”地址的参数有哪些
统一下单文档地址:https://pay.weixin.qq.com/wiki/doc/api/app/app.php?chapter=9_1
2.查看完下单接口之后,我们知道要传递过去的参数有,
Appid(在微信开放平台能够看到自己的appid);
mch_id(微信商户平台的id);
nonce_str(随机字符串,可自己生成,只要长度不超过32为就可以)
Body(商品描述,例:游戏币充值);
out_trade_no(商品订单号,可自己生成);
total_fee(商品价格,自己设置,100代表1元,因为微信默认是按分计算的);
spbill_create_ip(ip地址,也可以自己随便填写,不影响支付);
notify_url(通知地址,用户支付成功后,微信主动通知服务器,从而进行操作,测试时也可先随便填写一个)
trade_type(交易类型:App支付就填写APP)
交易类型:可到https://pay.weixin.qq.com/wiki/doc/api/app/app.php?chapter=4_2 这个地址去看下文档
sign(现在还差最重要,也是最容易出错的一个参数sign签名没有说到,sign签名其实就是将所有要传过去的参数拼接到一起,再拼接一个key=商户平台的密匙,再进行一个md5加密,后面我将会举出实例)
上面讲到的是集成微信支付,必须要传递过去的参数,下面将对这些参数中必须要自己写的参数给出实例,大家可以直接复制
3.参数实例
nonce_str随机字符串,自己生成的
function getNonceStr() {
$code = "";
for ($i=0; $i < 10; $i++) {
$code .= mt_rand(1000,2000); //获取随机数
}
$nonceStrTemp = md5($code);
$nonce_str = mb_substr($nonceStrTemp, 1,30); //MD5加密后截取30位字符
return $nonce_str;
}
$nonce_str=getNonceStr();
out_trade_no商户订单号
$out_trade_no =date('YmdHis').rand(10000000,99999999);
sign签名,自己参照微信文档,接口规则,安全文档拼接写
$str1="appid=$appid&body=$body&mch_id=$mch_id&nonce_str=$nonce_str¬ify_url=$notify_url&out_trade_no=$out_trade_no&spbill_create_ip=$spbill_create_ip&total_fee=$total_fee&trade_type=$trade_type&key=dsdsd3edwdwedewdcwededsdsdsdswdw";
$sign=strtoupper(md5($str1));//签名md5加密后,转换为大写
4.以上几步都弄完了之后,我们现在要将参数组成xml字符串,因为微信微信接收的参数和返回的参数都是xml的
拼接xml
$post_data =<<<xml
<xml>
<appid><![CDATA[自己填appid]]></appid>
<body><![CDATA[自己填商品介绍]]></body>
<mch_id><![CDATA[自己填商户id]]></mch_id>
<nonce_str><![CDATA[自己填随机字符串]]></nonce_str>
<notify_url><![CDATA[自己填回调地址]]></notify_url>
<out_trade_no><![CDATA[$out_trade_no]]></out_trade_no>
<spbill_create_ip><![CDATA[自己填ip地址]]></spbill_create_ip>
<total_fee><![CDATA[$total_fee]]></total_fee>
<trade_type><![CDATA[自己填支付类型,做app就填 app]]></trade_type>
<sign><![CDATA[填写签名,就是上面经过md5加密的]]></sign>
</xml>
xml;
5.拼接xml成功后,我们就可以通过post方式将数据发送给微信了
post方式将xml发送给微信
//初始化
$curl = curl_init();
//设置抓取的url
curl_setopt($curl, CURLOPT_URL, 'https://api.mch.weixin.qq.com/pay/unifiedorder');
//设置头文件的信息作为数据流输出
curl_setopt($curl, CURLOPT_HEADER, 0);
//设置获取的信息以文件流的形式返回,而不是直接输出。
curl_setopt($curl, CURLOPT_RETURNTRANSFER, 1);
//设置post方式提交
curl_setopt($curl, CURLOPT_POST, 1);
curl_setopt($curl, CURLOPT_POSTFIELDS,$post_data);
$data = curl_exec($curl);
//关闭URL请求
curl_close($curl);
$data就是微信返回过来的数据,用echo输出数据是什么也看不到的,这个问题我做的时候还找了一段时间的原因,因为微信返回过来的数据是一个xml,xml在浏览器就被解析了,中间的内容又是被注释的,
所以看页面上什么都没有,如果用echo输出的话,大家可以查看源文件就可以看到了
6.到了这里我们已经成功了一大半了,如果微信返回的数据没有问题,会返回一个prepay_id给我们
然后我们将微信返回过来的参数拼接一下发送给前端
我们查看微信调起支付接口文档,看看前端需要一些什么参数
前端需要的参数文档地址:https://pay.weixin.qq.com/wiki/doc/api/app/app.php?chapter=9_12&index=2
因为传递给前端的参数需要微信返回的数据,所以我们必须将微信返回过来的数据转换成数组,才能取出微信返回的参数
function Array1($xml)
{
//禁止引用外部xml实体
libxml_disable_entity_loader(true);
$values = json_decode(json_encode(simplexml_load_string($xml, 'SimpleXMLElement', LIBXML_NOCDATA)), true);
return $values;
}
$ar=Array1($data);//将xml转换成数组的结果,执行这个函数就将微信返回的数据变成数组了
到这里的时候我们需要注意的是返回给前端的参数,同样有一个sign签名,所以我们这里又要签名一次,签名方法和上面说的一样,就是将需要传递的参数拼接成字符串,然后md5加密
7.二次签名和返回给前端数据的代码
//获取当前时间的时间戳
$time=intval(time());
//进行二次签名
$str2="appid=$ar[appid]&noncestr=$nonce_str&package=Sign=WXPay&partnerid=$mch_id&prepayid=$ar[prepay_id]×tamp=$time&key=dsdsd3edwdwedewdcwededsdsdsdswdw";
$sign1=strtoupper(md5($str2));//签名md5加密后,转换为大写
echo "{\"appid\":\"$ar[appid]\",\"noncestr\":\"$nonce_str\",\"package\":\"Sign=WXPay\",\"partnerid\":\"$mch_id\",\"prepayid\":\"$ar[prepay_id]\",\"timestamp\":$time,\"sign\":\"$sign1\"}";
8.整体代码,上面教程最好是一步一步看,下面我将整体代码贴出来,大家也可以直接使用,修改下统一下单的参数就可以了
<?php
/*** 发送post请求* @param string $url 请求地址* @param array $post_data post键值对数据* @return string*/
header("Content-Type: text/html; charset=utf-8");
header("Access-Control-Allow-Origin: *");
//使用方法
$appid="wxd1015a07771ea640";//微信appid,在开放平台看
$mch_id="1503938301";//商户平台id,在商户平台查看
//nonce_str随机字符串,自己生成的
function getNonceStr() {$code = "";for ($i=0; $i < 10; $i++) {$code .= mt_rand(1000,2000); //获取随机数}$nonceStrTemp = md5($code);$nonce_str = mb_substr($nonceStrTemp, 1,30); //MD5加密后截取30位字符return $nonce_str;
}
$nonce_str=getNonceStr();
//商品描述
$body="微信测试";
//商户订单号
$out_trade_no = date('YmdHis').rand(10000000,99999999);
//总金额
$total_fee=10;
//终端ip
$spbill_create_ip='139.159.226.163';
//通知地址
$notify_url="https://www.baidu.com";
//交易类型
$trade_type="APP";
//签名,自己参照微信文档,接口规则,安全文档拼接写
$str1="appid=$appid&body=$body&mch_id=$mch_id&nonce_str=$nonce_str¬ify_url=$notify_url&out_trade_no=$out_trade_no&spbill_create_ip=$spbill_create_ip&total_fee=$total_fee&trade_type=$trade_type&key=dsdsd3edwdwedewdcwededsdsdsdswdw";
$sign=strtoupper(md5($str1));//签名md5加密后,转换为大写//要传递给微信的数据
$post_data =<<<xml
<xml><appid><![CDATA[$appid]]></appid><body><![CDATA[$body]]></body><mch_id><![CDATA[$mch_id]]></mch_id><nonce_str><![CDATA[$nonce_str]]></nonce_str><notify_url><![CDATA[$notify_url]]></notify_url><out_trade_no><![CDATA[$out_trade_no]]></out_trade_no><spbill_create_ip><![CDATA[$spbill_create_ip]]></spbill_create_ip><total_fee><![CDATA[$total_fee]]></total_fee><trade_type><![CDATA[APP]]></trade_type><sign><![CDATA[$sign]]></sign>
</xml>
xml;//初始化$curl = curl_init();//设置抓取的urlcurl_setopt($curl, CURLOPT_URL, 'https://api.mch.weixin.qq.com/pay/unifiedorder');//设置头文件的信息作为数据流输出curl_setopt($curl, CURLOPT_HEADER, 0);//设置获取的信息以文件流的形式返回,而不是直接输出。curl_setopt($curl, CURLOPT_RETURNTRANSFER, 1);//设置post方式提交curl_setopt($curl, CURLOPT_POST, 1);curl_setopt($curl, CURLOPT_POSTFIELDS,$post_data);$data = curl_exec($curl);//关闭URL请求curl_close($curl);//将微信返回过来的xml数据转换成数组function xmlToArray($xml){//禁止引用外部xml实体libxml_disable_entity_loader(true);$values = json_decode(json_encode(simplexml_load_string($xml, 'SimpleXMLElement', LIBXML_NOCDATA)), true);return $values;}$ar=xmlToArray($data);//将xml转换成数组的结果//获取当前时间的时间戳$time=intval(time());//进行二次签名$str2="appid=$ar[appid]&noncestr=$nonce_str&package=Sign=WXPay&partnerid=$mch_id&prepayid=$ar[prepay_id]×tamp=$time&key=dsdsd3edwdwedewdcwededsdsdsdswdw";$sign1=strtoupper(md5($str2));//签名md5加密后,转换为大写echo "{\"appid\":\"$ar[appid]\",\"noncestr\":\"$nonce_str\",\"package\":\"Sign=WXPay\",\"partnerid\":\"$mch_id\",\"prepayid\":\"$ar[prepay_id]\",\"timestamp\":$time,\"sign\":\"$sign1\"}";?>
php集成微信支付后台app端相关推荐
- 微信支付:app端提示微信签名失败,errCode=-2;后台服务端返回成功
1.微信有两个平台:一个开放平台一个商户平台 看开放平台V2版文档: 注意给微信传参的参数要小写: app端配置开放平台的签名 最好是打包正式版后获取的签名: 后台服务端有两次验签的过程,一定要第一次 ...
- 微信小程序、app集成微信支付
一.微信小程序支付 开发文档:https://pay.weixin.qq.com/wiki/doc/api/wxa/wxa_api.php?chapter=7_11&index=2 申请小程序 ...
- java app支付_Java 微信支付之APP支付服务端 (一)
Java 微信支付之APP支付服务端 (一) 如图所示,这是服务端要集成的所有微信接口.至于在开放平台申请就不做赘述了.主要流程,1.下单,2.异步通知,3.查询. 一.微信统一下单请求交易 /** ...
- Android app集成微信支付
Android app集成微信支付 鉴于微信支付的文档入口不太容易找到.以及文档中有些逻辑不通或者容易产生歧义或者缺失一些信息的情况,记录下此次接入的流程和需要关注的一些点. 使用的是app支付-&g ...
- Java 微信支付之APP支付服务端 (一)
Java 微信支付之APP支付服务端 (一) 如图所示,这是服务端要集成的所有微信接口.至于在开放平台申请就不做赘述了.主要流程,1.下单,2.异步通知,3.查询. 一.微信统一下单请求交易 /*** ...
- Android集成微信支付之-天坑
项目集成微信支付,折腾了三天左右,坑太多,做个简单记录 开通和主要原理不再讲了,参考微信支付官网 截个官网的业务流程图,下面好说明 1 支付结果回调(图中的17步) 支付结果回调,微信官方的说法是: ...
- android微信迁移数据,【CSDN博客迁移】Android集成微信支付之-天坑
项目集成微信支付,折腾了三天左右,坑太多,做个简单记录 开通和主要原理不再讲了,参考微信支付官网 截个官网的业务流程图,下面好说明 微信支付业务流程.png 1 支付结果回调(图中的17步) 支付结果 ...
- Android 集成微信支付和支付宝支付工具类
Android 集成微信支付和支付宝支付工具类 1.前言 去年年底接了一个商城app 外包项目,里面尼涉及到 微信和支付宝支付,这里我整理出几个工具类,下面就和大家分享一下,废话不多说,下面我一步一步 ...
- Hbuilder集成微信支付教程(简单流程)
整个系统运作的流程大致是这样: (1)APP向服务器发出需要付款的请求 (2)服务器请求微信服务端下单 (3)服务器将下单数据回复给APP (4)APP向微信服务端发起请求并输入密码进行支付 关键字用 ...
最新文章
- 关系型数据库之Mysql备份(五)
- 启动一个java项目http状态 500 - 内部服务器错误_Java web服务器假死分析
- extern“C”有什么作用
- html进制转换js代码,JS中的进制转换以及作用
- 本地计算机绑定域名访问
- 正则验证金额大于等于0,并且只到小数点后2位
- /bin/bash: jar: command not found(
- 【资料】机器学习笔记的github镜像下载(github个人star数量排名175)
- mysql定义变量字符串类型_mysqli_stmt :: bind_param():类型定义字符串中的元素数量与绑定变量的数量不匹配...
- java序列化 反序列化_Java序列化– Java序列化
- 详细介绍svn在eclipse中的使用(附图解说明)
- 【算法】排序_冒泡排序及其优化
- Matlab·Simulink的使用—【S函数的创建与应用】
- 设计模式-结构型软件设计模式(三)
- 还原 对于 服务器“DESKTOP-BNNIISU\SQLEXPRESS”失败。 (Microsoft.SqlServer.SmoExtended)
- 银联支付接口申请流程
- 使用Laravel和Vue.js2.5进行服务器端渲染
- miniUI ExcelExport导出JAVA实现
- SpringBoot+Vue项目小区物业管理系统
- 算法速成记录贴Day3
热门文章
- 资讯--2019年8月和9月
- 竹海杂谈:利用proteus设计电路(实例:485通信)
- 在Android studio里写一个Flutter程序
- could not automatically detect an adb binary.some emulator functionality will not work until a custo
- 移动安全加固助力 App 实现全面、有效的安全防护
- 透明大页相关内核参数_Oracle关于内存参数及大页设置的相关概念和设置之hugepage概念和配置...
- 【ES6】Module 语法(import 和 export)
- JS使用正则+replace实现replace All 全部替换的方法
- 保护环境,你可以做的更好
- 下班后我都学了什么1 | Hive