当前位置:   article > 正文

Unit 高效开发系列 - 第八章 微信和支付宝支付_unit开发

unit开发

Unit 高效开发系列 - 第八章 微信和支付宝支付

前言

Uinty高效开发系列主要包含一系列的Unity开发实例,主要来源于笔者的一个3D游戏项目和一个手机APP项目,适合利用Unity开发游戏或手机APP场景。

一、微信支付前置条件

1.申请微信开放平台账号,网址:https://open.weixin.qq.com/,需要300元审核费用

2.创建移动应用

  • 在微信开放平台申请移动应用,按指导操作,完成后截图:

在这里插入图片描述

3.开启微信支付

  • 申请微信支付,网址:https://pay.weixin.qq.com/,开启APP支付,开通成功后截图


在这里插入图片描述

4.进行API安全配置

  • 申请API证书、设置API秘钥。API证书在付款回调验证验签需要用到,在服务端的wxPayResultPro.php中修改,该处为简化处理,直接硬编码路径,商业时最好通过参数从c++传递进PHP函数)

在这里插入图片描述

5.获取支付需要的相关参数

  • 获取支付需要的相关参数,在服务端代码MsgCenter.cpp进行设置,需要参数如下图:

在这里插入图片描述

二、支付宝支付前置条件

  • 支付宝支付也需要跟微信做类似的账号申请,由于笔者没有实操过,这里就不做细致描述,示例程序中的支付宝支付账号来源于网络,可用于支付测试,

三、微信、支付宝登录

四、微信支付实现

  • c#客户端发送支付请求:
MI_GetTradeInfo_Req m_GetTradeInfo_Req = new MI_GetTradeInfo_Req();
m_GetTradeInfo_Req.userid = GlobalObj.g_UserId;

string uid = GlobalObj.g_UserId.ToString("X2").PadLeft(8, '0');

m_GetTradeInfo_Req.tradeno = ConvertDateTimep(DateTime.Now).ToString("X2") + uid;

m_GetTradeInfo_Req.zhifutype = ZhiFuTypeEnum.ZFE_WeiXin;        

GoodsInfo goodsInfo = new GoodsInfo();
goodsInfo.id = "id1";
goodsInfo.count = 1;
m_GetTradeInfo_Req.goodsinfos.Add(goodsInfo);

MsgCenter.Instance.SendNetMsg<MI_GetTradeInfo_Req>(MsgType.MsgTp_GetTradeInfo_Req, m_GetTradeInfo_Req);
Log.w("Pay: " + m_GetTradeInfo_Req.zhifutype.ToString());
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • C++服务端调用php获取交易信息,
zhiFuRsp.set_userid(zhiFuReq.userid());
string tradeinfo = "";
string payAmount = "1";
string strRet = "";
string currentDir = get_current_dir_name();
string strcmd = "php " + currentDir + "/Php/wxpay/wxPay.php " + mchid_1 + " " + WX_APPID + " " + apiKey_3 + " \'" + privateKey_4 + "\' " + serialNumber_5 + " " + payAmount + " " + tradeno + " " + orderName_8 + " " + notifyUrl_9;

MsgCenter::SystemForPhp(strcmd.c_str(), tradeinfo);

zhiFuRsp.set_appid(WX_APPID);
zhiFuRsp.set_partnerid(mchid_1);
zhiFuRsp.set_tradeinfo(tradeinfo);
zhiFuRsp.set_zhifutype(ZFE_WeiXin);
SendMsg<MI_GetTradeInfo_Rsp>(zhiFuRsp, MsgTp_GetTradeInfo_Rsp, ((MsgHead*)pMsgData)->MsgIndex, fd, client_addr);
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 微信支付获取交易信息服务端日志截图:

在这里插入图片描述

  • 客户端接收交易信息,调用微信客户端发起交易:
string[] tradeinfo = zhiFu_Rsp.tradeinfo.Split(' ');
wxPayTest.AndroidWxPay(zhiFu_Rsp.appid, zhiFu_Rsp.partnerId, tradeinfo[0], tradeinfo[1], tradeinfo[2], tradeinfo[3]);
  • 1
  • 2
  • 交易完成,微信支付平台发起支付结果通知,服务器处理支付结果通知日志截图如下:
    在这里插入图片描述
  • 微信支付手机截图
    在这里插入图片描述

五、支付宝支付实现

  • c#客户端发送支付请求:
MI_GetTradeInfo_Req m_GetTradeInfo_Req = new MI_GetTradeInfo_Req();
m_GetTradeInfo_Req.userid = GlobalObj.g_UserId;

m_GetTradeInfo_Req.tradeno = DateTime.Now.ToString("yyyyMMddHHmmssfff");

m_GetTradeInfo_Req.zhifutype = ZhiFuTypeEnum.ZFE_ZhiFuBao;

GoodsInfo goodsInfo = new GoodsInfo();
goodsInfo.id = "id1";
goodsInfo.count = 1;
m_GetTradeInfo_Req.goodsinfos.Add(goodsInfo);

MsgCenter.Instance.SendNetMsg<MI_GetTradeInfo_Req>(MsgType.MsgTp_GetTradeInfo_Req, m_GetTradeInfo_Req);
Log.w("Pay: " + m_GetTradeInfo_Req.zhifutype.ToString());
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • C++服务端调用php获取交易信息
string strRet = "";
string currentDir = get_current_dir_name();
string strcmd = "php " + currentDir + "/Php/zfbpay/zfbPay.php " + ZFB_APPID + " " + tradeno + " " + zfb_private_key + " " + ali_public_key + " " + zfbNotifyUrl + " " + payAmount;

LOG(Info, strcmd.c_str());

MsgCenter::SystemForPhp(strcmd.c_str(), tradeinfo);

zhiFuRsp.set_appid(ZFB_APPID);
zhiFuRsp.set_partnerid(mchid_1);
zhiFuRsp.set_tradeinfo(tradeinfo);
zhiFuRsp.set_zhifutype(ZFE_ZhiFuBao);

SendMsg<MI_GetTradeInfo_Rsp>(zhiFuRsp, MsgTp_GetTradeInfo_Rsp, ((MsgHead*)pMsgData)->MsgIndex, fd, client_addr);
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 支付宝支付服务端日志截图
    在这里插入图片描述

  • 客户端接收交易信息,调用微信客户端发起交易:

Log.w("prepay_id:" + zhiFu_Rsp.tradeinfo);
string tradeinfo = zhiFu_Rsp.tradeinfo;
wxPayTest.AndroidAliPay(zhiFu_Rsp.appid, tradeinfo);
  • 1
  • 2
  • 3

支付宝交易完成支付宝平台通知交易结果,服务器处理回调服务端日志截图
在这里插入图片描述

  • 支付宝支付手机截图
    在这里插入图片描述

六、示例工程编译及运行

  • 解压WeiXinAndZhiFuBaoPay.zip,可得到如下目录:
    在这里插入图片描述

  • ProtoGen: ProtoBuf编译目录,不用关注

  • WeiXinAndZhiFuBaoPay_UnityClient: 示例工程Unity客户端,使用unity
    2019.2.2f1版本打开WeiXinAndZhiFuBaoPay_UnityClient文件夹,在设置中将工程切换至Android平台。
    在这里插入图片描述

  • 打开Project Settings,导入和设置Keystore,测试工程中带的l00108587.keystore的密码是l00108587
    在这里插入图片描述

  • 设置Player和Package Name信息(与微信平台注册移动应用信息一致):
    在这里插入图片描述
    在这里插入图片描述

  • Build成xx.apk安装至手机。测试客户端截图
    在这里插入图片描述

  • WeiXinAndZhiFuBaoPay_C++Server: 示例工程服务器端,采用C++编译。
    编译环境:
    LSB Version: :core-4.1-amd64:core-4.1-noarch
    Distributor ID: CentOS
    Description: CentOS Linux release 8.5.2111
    protobuf-3.13.0
    gcc (GCC) 8.5.0 20210514 (Red Hat 8.5.0-4)
    g++ (GCC) 8.5.0 20210514 (Red Hat 8.5.0-4)
    cmake version 3.20.2
    PHP 8.0.26 (cli) (built: Dec 1 2022 03:47:54) ( NTS )

  • 编译方法
    将文件上传至centos系统,以”/xxfw/WeiXinAndZhiFuBaoPay/”目录为例,在MsgCenter.cpp中修改支付相关参数,及WeiXinAndZhiFuBaoPay_C++Server\Php\wxpay目录下的证书和私钥(apiclient_key.pem/cert.pem/serial_no.text)。
    在这里插入图片描述

cd /xxfw/WeiXinAndZhiFuBaoPay/
ls
make
在这里插入图片描述

  • 说明:
    服务端通过C++调PHP,不同版本的PHP可能会出现一些编编译、运行错误和告警,这些必须处理掉,否则将影响支付流程。

七、资源下载

  • 获取示例工程资源

链接:https://pan.baidu.com/s/1hNACupGmk9KQpGJ3oStD-g?pwd=jabf
提取码:jabf
获取解压密码
链接:http://jiajiatong.store/target.html?id=17
上一章:
链接:Unit 高效开发系列 - 第七章 基于微信和支付宝登录

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/IT小白/article/detail/116265
推荐阅读
相关标签
  

闽ICP备14008679号