php对接app微信支付的请求接口

1.获取请求参数接口


<?php 
ini_set('date.timezone','Asia/Shanghai');
define("APP_TYPE", "app");
//require_once "../lib/WxPay.Api.php";
//require_once "WxPay.JsApiPay.php";
require_once(APPPATH."paylib/lib/WxPay.Api.php");
require_once(APPPATH."paylib/demo/WxPay.JsApiPay.php");

//①、获取用户openid
$tools = new JsApiPay();


//获取参数
$attach_value 		= $_POST['attach']?$_POST['attach']:$_GET['attach'];	  		//其他参数
$body_value   		= $_POST['body']?$_POST['body']:$_GET['body'];	  		//传输内容
$total_fee_value 	= $_POST['total_fee']?$_POST['total_fee']:$_GET['total_fee']; 		//支付的现金金额
$out_trade_no_value = $_POST['out_trade_no']?$_POST['out_trade_no']:$_GET['out_trade_no']; 	//支付订单号

$success_url 	= config_item('APP_DOMAIN');
$fail_url 		= config_item('APP_DOMAIN');;
$cancel_url 	= config_item('APP_DOMAIN');;

//②、统一下单
$input = new WxPayUnifiedOrder();
$input->SetBody($body_value);
$input->SetAttach($attach_value);
$input->SetOut_trade_no($out_trade_no_value);
$input->SetTotal_fee($total_fee_value);
$input->SetTime_start(date("YmdHis"));
$input->SetTime_expire(date("YmdHis", time() + 600));

$input->SetNotify_url(config_item('APP_DOMAIN')."Pay/notify_app");
$input->SetTrade_type("APP");

//$input->SetOpenid($openId);
$order 				= WxPayApi::unifiedOrder($input);
$order['success_url']	= $success_url;
$order['fail_url']		= $fail_url;
$order['cancel_url']	= $cancel_url;

$jsApiParameters = json_encode($order);

echo $jsApiParameters;exit();



2.微信通知接口

<?php
ini_set('date.timezone','Asia/Shanghai');
error_reporting(E_ERROR);


define("APP_TYPE", "app");


define('IN_ECS', true);




require_once APPPATH."paylib/lib/WxPay.Api.php";
require_once APPPATH.'paylib/lib/WxPay.Notify.php';
require_once APPPATH.'paylib/demo/log.php';


//初始化日志
$logHandler= new CLogFileHandler(APPPATH."paylib/logs/".date('Y-m-d').'.log');
$log = Log::Init($logHandler, 15);

Log::DEBUG("query:start".date("Y-m-d H:i:s"));


//回调封装
class notify_app extends CI_Model
{
    public function __construct()
    {

        parent::__construct();

        $this->load->database();
//        $this->load->library("session");
//        $this->load->helper('url');
        $this->load->model('Pay_model','pay');

    }

    /**商城回调
     * @author xiexingqiao
     * @param $order_sn 订单号
     * @param $attach
     * @param $flow_sn 微信流水号
     * @param $total_fee 总金额  以元计算
     * @param $pay_channel 支付渠道
     * @param $pay_name 支付名称
     */
    public function shop_pay_success($order_sn,$attach,$flow_sn,$total_fee,$pay_channel,$pay_name)
    {

        $this->db->trans_start();
        $ret = $this->pay->shop_pay_success($order_sn,$attach,$flow_sn,$total_fee,$pay_channel,$pay_name);

        $this->db->trans_complete();
        echo json_encode($ret);
    }
    public function service_pay_success($order_sn,$attach,$flow_sn,$total_fee,$pay_channel,$pay_name)
    {
        $this->db->trans_start();
        $ret = $this->pay->serivce_pay_success($order_sn,$attach,$flow_sn,$total_fee,$pay_channel,$pay_name);
        $this->db->trans_complete();
        echo json_encode($ret);

    }
}





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")
		{
			return 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;
		}
		
		$transaction_id = $data["transaction_id"];


	if($data['attach']=='shop_pay')
        {
            Log::DEBUG("query:start".date("Y-m-d H:i:s"));
            //商城支付
            $order_sn = $data['out_trade_no'];
            $attach = 'shop_pay';
            $flow_sn=$transaction_id;
            $total_fee=$data['total_fee']/100;
            $pay_channel ='weixinapp';
            $pay_name = '微信支付';
            $notify_obj = new notify_app();
            $notify_obj->shop_pay_success($order_sn,$attach,$flow_sn,$total_fee,$pay_channel,$pay_name);
        }elseif ($data['attach']=='service_pay')
        {
            Log::DEBUG("query:start".date("Y-m-d H:i:s"));
            $order_sn = $data['out_trade_no'];
            $attach = 'service_pay';
            $flow_sn=$transaction_id;
            $total_fee=$data['total_fee']/100;
            $pay_channel ='weixinapp';
            $pay_name = '微信支付';
            $notify_obj = new notify_app();
            $notify_obj->service_pay_success($order_sn,$attach,$flow_sn,$total_fee,$pay_channel,$pay_name);
        }


		//order_paid($order_sn, 2, APP_TYPE);
		
		Log::DEBUG("NotifyProcess true");
		return true;
	}
}

Log::DEBUG("begin notify");
$notify = new PayNotifyCallBack();
$notify->Handle(false);




  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
微信 支付这 官方文档 很乱 写的 也不是很清楚,测试时 一定要与安卓 或 苹果端 一起测试。 否则 根本找不到问题。 废话 不过说 先 说说 几大坑的地方。我也是 借鉴 别人的 博客 才测试成功调起支付。文章后 直接上代码 代码 绝对能调起 微信 测试过的! 第一步,生成prepayid,这一步,只要你的appid,mch_id,key没写错,那么99%以上都能获取到prepayid,如果失败,那肯定是几个ID和key有问题,仔细检查,包括编码等,仔细仔细仔细检查。 问题来了,第二步,对获取到的prepayid进行二次签名,官方文档的坑来了,官方并没有详细说明这一步骤,一切的一切只能靠自己摸索,爬坑。 首先第一坑:参数顺序,我这里用了SortedMap,自动对参数进行asc编码顺序,一劳永逸,当然,也可以用其他map,但一定要注意参数顺序,必须是asc编码顺序。 第二坑:参数package的Sign=WXPay中=的编码问题,转码即可,小坑。 第三坑:苹果系统的timestamp位数,统一成10位即可,小坑。 第四坑:次级大坑,注意,官方文档说到的参与二次签名的参数,prepayId,appId,timeStamp等,如果你用他们的驼峰进行大写,那么你就完了。一定要小写,小写,小写。 第五坑:最大坑,一样,官方文档并没有对于二次签名有过多赘述,如果你上面几个坑完美出坑,那么,你获取到的签名sign跟官方验证的sign绝对是一样的,然而,将这些玩意丢回给APPAPP调起支付,大大的几个字出现了,验证签名失败!WTF!不要急,我已折腾了好几天,终于发现坑在哪里,那就是noncestr随机字符串,参与二次签名的随机字符串不能再次生成,注意,不能再次生成,一定要用第一步中获取prepayid时的那串字符串,一定要用第一步中获取prepayid时的那串字符串,一定要用第一步中获取prepayid时的那串字符串。 第六坑:经历了上述5坑,相信你已经有想干死人的冲动,那么你以为这就结束了吗,还有最后一坑,那就是APP签名已经包名,一定要与开放平台中的一致,然而,即使一致了你以为又结束了吗,NO,如果你更改过开放平台中的签名,并且,在更改前调用过APP微信支付,那么一定一定一定一定记得清除微信缓存。 至此,所有坑都成功出坑,终于出现了支付页面,举国欢腾,微信去年买了个表。最后附上MD5签名类
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值