吾爱破解 - 52pojie.cn

 找回密码
 注册[Register]

QQ登录

只需一步,快速开始

查看: 66404|回复: 125
收起左侧

[其他转载] 【笔记】微信支付终于成功了(安卓,iOS),在此分享

    [复制链接]
allam 发表于 2016-5-6 15:48
本帖最后由 奋斗丶小Z 于 2016-6-6 13:48 编辑

第一次发文章 希望这篇文章对大家有用。
经过了几天的痛苦煎熬,终于把微信支付调通,整个调试过程很痛苦,痛苦的主要来源是微信支付的调试真的是,以前调试公众号支付也是一波三折啊。好吧,开始!首先说明,我这里主要没有使用getToken,getOrder方法,我的所有参数全部是在后端生成传递给前端的,看了一下前面朋友分享的源代码,还用到了jquery,md5,sha对于新手来说简直是天文啊,而且jquery在apicloud中效率不好,所以放弃了研究那个代码,另外官方也说了,最好签名等参数全部服务器端生成,微信也是这么说的。

注意:微信本身在apicloud中config.xml文件你要先弄好
先看一下APP端的代码
  • function wx_pay()
  • {
  •         api.ajax(
  •         {
  •                 url : serverURL+"weixin/example/app.php",
  •                 method : 'POST',
  •                 timeout : '30',
  •                 dataType : 'json',
  •                 returnAll : false,
  •                 cache :true,
  •                 data:
  •                 {
  •                         values:{type:"login"}
  •                 }
  •         },
  •         function(ret, err)
  •         {
  •                 if (ret)
  •                 {
  •                         var back_info=ret;
  •                         var weiXin = api.require('weiXin');
  •                         weiXin.registerApp
  •                         (
  •                             function(ret,err)
  •                             {
  •                                 if (ret.status)
  •                                 {
  •                                         weiXin.payOrder(
  •                                         {
  •                                 orderId:back_info.prepayid,
  •                                 partnerId:back_info.partnerid,
  •                                 nonceStr:back_info.noncestr,
  •                                 timeStamp:back_info.timestamp,
  •                                 package:back_info.package,
  •                                 sign:back_info.sign
  •                                 },function(ret,err)
  •                                 {
  •                                      if (ret.status)
  •                                      {
  •                                              $alert('支付成功');
  •                                      }
  •                                      else
  •                                      {
  •                                              $alert(err.msg);
  •                                      }
  •                                 });
  •                                 }
  •                                 else
  •                                 {
  •                                         $alert(err.msg);
  •                                 }
  •                             }
  •                         );
  •                 }
  •                 else
  •                 {
  •                         $alert(json2str(err));
  •                 }
  •         });
  • }
复制代码完全按照apicloud写的,没有任何问题,大家可以直接复制过去用,其中的$alert是我自己封装的方法,就是弹出信息而已
这个是从微信官方下载下来的,坑爹的微信给的事例太垃圾了,说明也不细致,统一下单的接口生成有了,但是app数据的生成没有,只有js的生成,只能自己写了,其中的签名,随机字符串,还有时间戳等等,每次请求,生产都要重新来一遍,更加可恶的一件事情是,竟然大小写不一致,我本以为直接将js的稍微修改修改就好了,结果不行,死活找不到原因,后来仔细对照文档看了一下,js调起支付的很多参数是有大小写的,但是app调起是全部小写的,具体文档见下方:

JS:https://pay.weixin.qq.com/wiki/doc/api/jsapi.php?chapter=7_7
APP:https://pay.weixin.qq.com/wiki/d ... hapter=9_12&index=2

你们也可以仔细对比,太坑爹了。好了,不埋怨了,看代码吧。
首先打开example/app.php,这个是我写的接口文件
  • <?php
  • ini_set('date.timezone','Asia/Shanghai');
  • //error_reporting(E_ERROR);
  • require_once "../lib/WxPay.Api.php";
  • require_once "WxPay.AppPay.php";
  • $notify = new AppPay();
  • /*首先生成prepayid*/
  • $input = new WxPayUnifiedOrder();
  • $input->SetBody("test1");//商品或支付单简要描述(必须填写)
  • //$input->SetAttach("test2");//附加数据,在查询API和支付通知中原样返回,该字段主要用于商户携带订单的自定义数据(不必填)
  • //$input->SetDetail("Ipad mini  16G  白色,黑色");//商品名称明细列表(不必填)
  • $input->SetOut_trade_no(WxPayConfig::MCHID.date("YmdHis"));//订单号(必须填写)
  • $input->SetTotal_fee("1");//订单金额(必须填写)
  • //$input->SetTime_start(date("YmdHis"));//交易起始时间(不必填)
  • //$input->SetTime_expire(date("YmdHis",time()+600));//交易结束时间10分钟之内不必填)
  • $input->SetGoods_tag("test");//商品标记(不必填)
  • $input->SetNotify_url("http://tc.weixinxa.com/app/weixin/example/****.php");//回调URL(必须填写)
  • $input->SetTrade_type("APP");//交易类型(必须填写)
  • //$input->SetProduct_id("123456789");//rade_type=NATIVE,此参数必传。此id为二维码中包含的商品ID,商户自行定义。
  • $order = WxPayApi::unifiedOrder($input);//获得订单的基本信息,包括prepayid
  • $appApiParameters = $notify->GetAppApiParameters($order);//生成提交给app的一些参数
  • die($appApiParameters);
  • ?>
复制代码以上回调URL一定要写好,我这个附件中还没有做回调的处理,我处理完了继续跟帖上来。

注意几点:
1.交易类型必须是APP,如果你是申请的微信公众号的支付,而不是从https://open.weixin.qq.com/这里申请的,就用不成
2.第一步是生成order,返回的是一个数组,保证这个数组里面要有prepay_id,如果没有,那你就要检查配置文件了lib/WxPay.Config.php

继续看代码
example/WxPay.AppPay.php
  • <?php
  • /**
  • *
  • * APP支付实现类
  • * @author widyhu
  • *
  • */
  • class AppPay
  • {
  •         /**
  •          *
  •          * 参数数组转换为url参数
  •          * @param array $urlObj
  •          */
  •         private function ToUrlParams($urlObj)
  •         {
  •                 $buff = "";
  •                 foreach ($urlObj as $k => $v)
  •                 {
  •                         $buff .= $k . "=" . $v . "&";
  •                 }
  •                 $buff = trim($buff, "&");
  •                 return $buff;
  •         }
  •         /**
  •          *
  •          * 生成直接支付url,支付url有效期为2小时,模式二
  •          * @param UnifiedOrderInput $input
  •          */
  •         public function GetPayPrepayId($input)
  •         {
  •                 if($input->GetTrade_type()=="APP")
  •                 {
  •                         $result = WxPayApi::unifiedOrder($input);
  •                         return $result;
  •                 }
  •         }
  •         /*生成APP提交数据*/
  •         public function GetAppApiParameters($UnifiedOrderResult)
  •         {
  •                 if(!array_key_exists("appid", $UnifiedOrderResult)
  •                 || !array_key_exists("prepay_id", $UnifiedOrderResult)
  •                 || $UnifiedOrderResult['prepay_id'] == "")
  •                 {
  •                         throw new WxPayException("参数错误");
  •                 }
  •                 $appapi = new WxPayAppApiPay();
  •                 $appapi->SetAppid($UnifiedOrderResult["appid"]);
  •                 $appapi->SetPartnerId($UnifiedOrderResult["mch_id"]);
  •                 $appapi->SetPrepayId($UnifiedOrderResult["prepay_id"]);
  •                 $timeStamp = time();
  •                 $appapi->SetTimeStamp($timeStamp);
  •                 $appapi->SetNonceStr(WxPayApi::getNonceStr());
  •                 $appapi->SetPackage("Sign=WXPay");
  •                 $appapi->SetSign($appapi->MakeSign());
  •                 $back_arr=$appapi->GetValues();
  •                 $back_arr['prepay_id']=$UnifiedOrderResult["prepay_id"];
  •                 $parameters = json_encode($appapi->GetValues());
  •                 return $parameters;
  •         }
  • }
复制代码这个文件不是官方提供的,是我自己写的,仿照WxPay.NativePay.php这个文件写的,主要看42行GetAppApiParameters这个函数。由此生成了app提交的很多基础数据,在这个文件中又引用了一个类WxPayAppApiPay,在lib/WxPay.Data.php中,最后一个函数,现在我们来看一下配置文件吧/lib/WxPay.Config.php
  • <?php
  • /**
  • *         配置账号信息
  • */
  • class WxPayConfig
  • {
  •         //=======【基本信息设置】=====================================
  •         //
  •         /**
  •          * TODO: 修改这里配置为您自己申请的商户信息
  •          * 微信公众号信息配置
  •          *
  •          * APPID:绑定支付的APPID(必须配置,开户邮件中可查看)
  •          *
  •          * MCHID:商户号(必须配置,开户邮件中可查看)
  •          *
  •          * KEY:商户支付密钥,参考开户邮件设置(必须配置,登录商户平台自行设置)
  •          * 设置地址:https://pay.weixin.qq.com/index.php/account/api_cert
  •          *
  •          * APPSECRET:公众帐号secert(仅JSAPI支付的时候需要配置, 登录公众平台,进入开发者中心可设置),
  •          * 获取地址:https://mp.weixin.qq.com/advanced/advanced?action=dev&t=advanced/dev&token=2005451881&lang=zh_CN
  •          * @var string
  •          */
  •         const APPID = 'wxd3ae8cc5ab312345';
  •         const MCHID = '1250189001';
  •         const KEY = '14e1b600b1fd579f47433b88e8d85111';
  •         const APPSECRET = 'e43930e9e262176356adbf1101e11111';
  •         /*公众号(如果你申请的微信公众号支付而不是微信支付就用这个,但是这个没有办法在app中使用,只能通过扫码或者js)
  •         const APPID = 'wx223c1e5d831c94a5';
  •         const MCHID = '1232570702';
  •         const KEY = '14e1b600b1fd579f47433b88e8d85291';
  •         const APPSECRET = '8d6329ec3fb4195f857aee0749c3aad2';*/
  •         //=======【证书路径设置】=====================================
  •         /**
  •          * TODO:设置商户证书路径
  •          * 证书路径,注意应该填写绝对路径(仅退款、撤销订单时需要,可登录商户平台下载,
  •          * API证书下载地址:https://pay.weixin.qq.com/index.php/account/api_cert,下载之前需要安装商户操作证书)
  •          * @var path
  •          */
  •         const SSLCERT_PATH = '../cert/apiclient_cert.pem';
  •         const SSLKEY_PATH = '../cert/apiclient_key.pem';
  •         //=======【curl代{过}{滤}理设置】===================================
  •         /**
  •          * TODO:这里设置代{过}{滤}理机器,只有需要代{过}{滤}理的时候才设置,不需要代{过}{滤}理,请设置为0.0.0.0和0
  •          * 本例程通过curl使用HTTP POST方法,此处可修改代{过}{滤}理服务器,
  •          * 默认CURL_PROXY_HOST=0.0.0.0和CURL_PROXY_PORT=0,此时不开启代{过}{滤}理(如有需要才设置)
  •          * @var unknown_type
  •          */
  •         const CURL_PROXY_HOST = "0.0.0.0";//"10.152.18.220";
  •         const CURL_PROXY_PORT = 0;//8080;
  •         //=======【上报信息配置】===================================
  •         /**
  •          * TODO:接口调用上报等级,默认紧错误上报(注意:上报超时间为【1s】,上报无论成败【永不抛出异常】,
  •          * 不会影响接口调用流程),开启上报之后,方便微信监控请求调用的质量,建议至少
  •          * 开启错误上报。
  •          * 上报等级,0.关闭上报; 1.仅错误出错上报; 2.全量上报
  •          * @var int
  •          */
  •         const REPORT_LEVENL = 1;
  • }

复制代码主要是修改
  • const APPID = 'wxd3ae8cc5ab312345';
  • const MCHID = '1250189001';
  • const KEY = '14e1b600b1fd579f47433b88e8d85111';
  • const APPSECRET = 'e43930e9e262176356adbf1101e11111';
复制代码其他的不要动就行了
就这么多了,我现在继续写回调处理的url,写好了继续上吧
相信很多人都遇到了问题,不然怎么可能在论坛里面搜索微信支付没有一个可以实际解决问题的呢。
增加了回调,看代码,把以下代码覆盖到/lib/example/notify.php这个文件就可以了
  • <?php
  • ini_set('date.timezone','Asia/Shanghai');
  • error_reporting(E_ERROR);
  • require_once "../lib/WxPay.Api.php";
  • require_once '../lib/WxPay.Notify.php';
  • require_once 'log.php';
  • //初始化日志
  • $logHandler= new CLogFileHandler("../logs/".date('Y-m-d').'.log');
  • $log = Log::Init($logHandler, 15);
  • class PayNotifyCallBack extends WxPayNotify
  • {
  •         //查询订单
  •         public function Queryorder($transaction_id)
  •         {
  •                 $input = new WxPayOrderQuery();
  •                 $input->SetTransaction_id($transaction_id);
  •                 $result = WxPayApi::orderQuery($input);
  •                 Log::DEBUG("query:" . json_encode($result));
  •                 if(array_key_exists("return_code", $result)
  •                         && array_key_exists("result_code", $result)
  •                         && $result["return_code"] == "SUCCESS"
  •                         && $result["result_code"] == "SUCCESS")
  •                 {
  •                         $out_trade_no=$result['out_trade_no'];//私有订单号,你就用这个订单号来进行你自己订单的各种更新吧
  •                         $mch_id=$result['mch_id'];//商户号
  •                         $total_fee=$result['total_fee'];//支付金额,出来的金额要除以100
  •                         $transaction_id=$result['transaction_id'];//微信内部的订单流水号
  •                         $openid=$result['openid'];//微信加密的用户身份识别,app支付的话其实意义不大了
  •                         /*以下两行用做调试,会自动生成in_test.txt文件而且后期内容会自动追加到这个文件*/
  •                         $fp = fopen('in_test.txt','a+');
  •                         fwrite($fp,date("Y-m-d H:i:s").json_encode($result) . "|".$transaction_id." 成功了!rn");
  •                         /**/
  •                         return true;//这个很重要,微信的异步请求,当你执行完了你的内部处理以后给他返回true,微信就认为你的内部处理完成了,就不会再次请求你了,否则他会一直请求你这个文件,知道超时。
  •                 }
  •                 return false;
  •         }
  •         //重写回调处理函数
  •         public function NotifyProcess($data, &$msg)
  •         {
  •                 Log::DEBUG("call back:" . json_encode($data));
  •                 $notfiyOutput = array();
  •                 if(!array_key_exists("transaction_id", $data)){
  •                         $msg = "输入参数不正确";
  •                         return false;
  •                 }
  •                 //查询订单,判断订单真实性
  •                 if(!$this->Queryorder($data["transaction_id"])){
  •                         $msg = "订单查询失败";
  •                         return false;
  •                 }
  •                 return true;
  •         }
  • }
  • Log::DEBUG("begin notify");
  • $notify = new PayNotifyCallBack();
  • $notify->Handle(false);

复制代码



点评

对不起啊。。评分时CB点错了,楼下补回来。。。  发表于 2016-5-7 07:13
做得好。给分给分  发表于 2016-5-6 23:55
赠人玫瑰,手留余香.  发表于 2016-5-6 16:05

免费评分

参与人数 48吾爱币 +2 热心值 +47 收起 理由
ybyanghao + 1 + 1 用心讨论,共获提升!
nsns + 1 谢谢@Thanks!
黄俊熙 + 1 热心回复!
flyfee + 1 谢谢@Thanks!
q396848273 + 1 谢谢@Thanks!
qaz003 + 1 用心讨论,共获提升!
美美木耶 + 1 感谢发布原创作品,吾爱破解论坛因你更精彩!
wa415123808 + 1 感谢发布原创作品,吾爱破解论坛因你更精彩!
Jamesstrange + 1 热心回复!
Neliukka + 1 谢谢@Thanks!
mass哦啦 + 1 热心回复!
52113141111 + 1 热心回复!
北鱼何为 + 1 我很赞同!
still778 + 1 谢谢@Thanks!
ljy1999 + 1 感谢发布原创作品,吾爱破解论坛因你更精彩!
wuxinwufei + 1 鼓励转贴优秀软件安全工具和文档!
Dumeng + 1 虽然不懂但也要个大神分
绯红夜雪 + 1 热心回复!
yang0317 + 1 用心讨论,共获提升!
caimin364782 + 1 请收下我的膝盖
733777 + 1 热心回复!
sk285901309 + 1 鼓励转贴优秀软件安全工具和文档!
唐寅飞飞 + 1 写的够认真,给分啦~
smiao + 1 热心回复!
1175761559 + 1 虽然看不懂,热心滚起
sce + 1 我很赞同!
文斯 + 1 赠人玫瑰,手留余香
gouqingyuan + 1 我很赞同!
rovyn001 + 1 热心回复!
特百惠 + 1 这不是语言编程吗!!是哪种语言呢
yangxiaolu + 1 热心回复!
小维维哟 + 1 欢迎分析讨论交流,吾爱破解论坛有你更精彩!
LzSkyline + 1 不错,我也很喜欢用APICLOUD
尛航 + 1 不懂,是干嘛用的
希太 + 1 吊大的说一下这是什么啊
rental + 1 热心回复!
兴哥 + 1 我很赞同!
w820325611 + 1 不明觉厉
13917763240 + 1 热心回复!
至尊灬骉哥 + 1 ID和我有一拼
530176402 + 1 我很赞同!
甲乙丙丁 + 1 挺好,但是是干嘛用的?
supersqs + 1 写的太好了!我却什么也看不懂!
shangbu + 1 虽然不懂,但是热心走起
blurrong + 1 留有余香,谢谢分享
修罗本灭世 + 1 热心回复!
冰封的记忆~ + 1 虽然不懂,但是热心走起
过儿爱龙儿 + 1 热心回复!

查看全部评分

本帖被以下淘专辑推荐:

发帖前要善用论坛搜索功能,那里可能会有你要找的答案或者已经有人发布过相同内容了,请勿重复发帖。

 楼主| allam 发表于 2016-5-8 00:17 来自手机
jyqjyq123 发表于 2016-5-7 16:19
楼主大神,我是小白,我想问下,这样破解是不是就可以安卓或ios的游戏,只要用微信支付的订单,都能支付成 ...

不全可以!
jyqjyq123 发表于 2016-5-7 16:19
楼主大神,我是小白,我想问下,这样破解是不是就可以安卓或ios的游戏,只要用微信支付的订单,都能支付成功呀,我不知道这样问您能理解吗
sgx458208964 发表于 2016-5-6 15:51
特色的名字 发表于 2016-5-6 15:52
大牛你说多我看不懂 哈哈 这两天的确微信fd改不了价了 这要怎么破
浪人随风 发表于 2016-5-6 15:56
支持楼主 最近利用抓包那些改价的 不感觉很不地道吗
慢慢的拼凑 发表于 2016-5-6 16:00
看不懂 。。。z
 楼主| allam 发表于 2016-5-6 16:04

多学习这方面的知识慢慢就能看懂了。
15766328312 发表于 2016-5-6 16:06
小白表示不懂
我只想静静 发表于 2016-5-6 16:06 来自手机
支持下,,
修罗本灭世 发表于 2016-5-6 16:07
感觉莫名 叼 支持楼主
realli123 发表于 2016-5-6 16:11
小白表示不懂
您需要登录后才可以回帖 登录 | 注册[Register]

本版积分规则

返回列表

RSS订阅|小黑屋|处罚记录|联系我们|吾爱破解 - LCG - LSG ( 京ICP备16042023号 | 京公网安备 11010502030087号 )

GMT+8, 2024-11-15 15:42

Powered by Discuz!

Copyright © 2001-2020, Tencent Cloud.

快速回复 返回顶部 返回列表