微信支付不使用服务器端,微信支付之app支付服务器端

微信的app支付,为了实现ios跟安卓的同时使用,还有就是为了保证支付的安全性,所以把微信app支付中的统一下单跟签名都放在了服务器端,这里用的是yii2中的api接口处理的,在签名时也是遇到了一些问题,这里做一下总结:

微信app支付没有单独的包,微信的官方文档中也没有具体的服务器端的demo,所以第一次做还是很费劲的,所以就索性用微信公众号支付的包吧。

这是微信app在yii2中的目录截图:

873ddd95d24682d3f15b7d51345fd36e.png

跟微信公众号支付的包基本是一样的,只是在签名的时候,我做了一些改动:

控制器是这样的:?php

namespace api\modules\RestApi\modules\v1\controllers;

use Yii;

use api\modules\RestApi\controllers\CommonController;

use common\lib\WxAppPay\WxPayApi;

use common\models\Store;

use common\models\AlipayRecord;

use common\models\Order;

use common\models\Paylog;

use common\models\Cashrecord;

use common\lib\WxAppPay\Extend\WxPay;

use common\lib\WxAppPay\Extend\PayNotify;

use common\lib\AliAppPay\lib\AlipayRsaNotify;

use common\lib\AliAppPay\lib\AlipayRsaSubmit;

class PaysController extends CommonController

{

public $modelClass = 'api\modules\RestApi\models\Order';

public function init()

{

parent::init();

$this->enableCsrfValidation = false;

}

public function actionView($id) //微信app的支付准备

{

if (empty($id))

throw new \Exception('参数错误!');

$model = new $this->modelClass;

$res = $model->isPayResult($id); //判断是否支付

$store = new Store();

$storeInfo = $store->getFrontOne(['id'=>$res['info']->storeid]);

$WxPay = new WxPay();

try {

//统一下单

$input = new \WxPayUnifiedOrder();

$input->SetBody("小程府-" . $storeInfo->name); //商品详情

$input->SetOut_trade_no($id);

$input->SetTotal_fee($res['info']->yingshou * 100); //金额

$input->SetTime_start(date("YmdHis"));

$input->SetTime_expire(date("YmdHis", time() + 600));

$input->SetGoods_tag("xcf");//商品标记

$input->SetNotify_url("http://api.xxx.cn/RestApi/v1/pays/notifywx/");

$input->SetTrade_type("APP");

$UnifiedOrderResult = WxPayApi::unifiedOrder($input);

$apps = $WxPay->GetAppApiParameters($UnifiedOrderResult);//返回签名

return $this->ajaxReturn($apps);

} catch (\Exception $e) {

return $e->getMessage();

}

}

public function actionNotifywx(){ //微信app的回调

//        $rsv_data = $GLOBALS ['HTTP_RAW_POST_DATA'];

//        $re = xmlarray($rsv_data);‘php://input', ‘r'

//        $rsv_data = file_get_contents('php://input');

$notify = new PayNotify();

$notify->Handle(false);

}

这里用到的wxpay类也在common/lib/wxAppPay/Extend中,签名部分做了改动,代码如下:public function GetAppApiParameters($UnifiedOrderResult)

{

if(!array_key_exists("appid", $UnifiedOrderResult)//公众账号id

|| !array_key_exists("prepay_id", $UnifiedOrderResult)

|| $UnifiedOrderResult['prepay_id'] == "")

{

throw new \WxPayException("参数错误");

}

$jsapi = new \WxPayJsApiPay();

$jsapi->SetAppid($UnifiedOrderResult["appid"]);//重新设置公众号id

$jsapi->SetPartnerid($UnifiedOrderResult["mch_id"]);//商户号id

$jsapi->SetPrepayid($UnifiedOrderResult["prepay_id"]);//预支付id

$jsapi->SetPackage("Sign=WXPay");//设置订单详情扩展字符串

$jsapi->SetNonceStr(WxPayApi::getNonceStr());//设置随机字符串

$timeStamp = time();

$jsapi->SetTimeStamp("$timeStamp");//设置支付时间戳

//    $jsapi->SetSign($jsapi->MakeSign());

$parameters1 = $jsapi->GetValues();//获取设置的值

//签名要放到最后一步,把时间戳也要拿来签名

$jsapi->SetAppSign($parameters1);

//    $jsapi->setPackage_app("Sign=WXPay");

//将签名重新放到返回的值里返回

$parameters = $jsapi->GetValues();//获取设置的值

unset($parameters['package']);

$parameters['package_app'] = "Sign=WXPay";

return $parameters;

}

注意:上面的注释部分很重要,如果不按微信文档中的走,签名始终是失败的,那是相当痛苦的一件事

还有回调,跟微信公众号支付是一样的,这里我也把app支付的包提供出来:

百度云链接: http://pan.baidu.com/s/1eSkFlsQ密码: ge2f  拿走不谢,如果遇到什么问题,可以qq联系!

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值