前不久公司拓展海外市场,要接入google支付。刚开始一头雾水,相关的文档实在太少。而且很多东西都需要翻墙,不过好在摸索几天后,总算调试通了。

前提:翻墙

1、注册账号google账号

https://accounts.google.com/SignUp

2、注册googleplay开发者账号

https://play.google.com/apps/publish/signup/

这一步骤需要Google账号和带有Visa或Master等标志的银行卡或者信用卡,资费25美元

3、新建auth2.0应用

  登陆 Google Developer Console,地址:https://code.google.com/apis/console/  在APIs & auth 项中找到 Credentials,点击创建一个auth2.0 的web应用。其中callback的地址一定是可用域名 + /oauth2callback
创建完后,可以获得,client_id, client_secret, redirect_uri

4、get请求获取code

  1. 参数:
  1. scope=https://www.googleapis.com/auth/androidpublisher
  1. response_type=code access_type=offline redirect_uri=上一步获取的 client_id=上一步获取的
    浏览器访问:https://accounts.google.com/o/oauth2/auth?scope=https://www.googleapis.com/auth/androidpublisher&response_type=code&access_type=offline&redirect_uri=https://test1fffff.firebaseapp.com/oauth2callback/oauth2callback&client_id=816630003638-5p27m684jfpfa6sh6l9chbpreq2hg9ov.apps.googleusercontent.com
    获得:https://test1fffff.firebaseapp.com/oauth2callback/oauth2callback?code=4/CpVOd8CljO_gxTRE1M5jtwEFwf8gRD44vrmKNDi4GSS.kr-GHuseD-oZEnp6UADFXm0E0MD3FlAI

该步骤获得code=4/CpVOd8CljO_gxTRE1M5jtwEFwf8gRD44vrmKNDi4GSS.kr-GHuseD-oZEnp6UADFXm0E0MD3FlAI

5、利用code 获取refresh_token  (post请求)

  地址: $refresh_token_url="https://accounts.google.com/o/oauth2/token";

  请求参数:

  1. $data_tmp1 = array(
  2. 'grant_type'=>'authorization_code',
  3. 'code'=>'',//上一步获取的
  4. 'client_id'=>'',//第三步获取
  5. 'client_secret'=>'',//第三步获取
  6. 'redirect_uri'=>'',//第三步获取
  7. );

$http = new http($refresh_token_url,'POST',5);
$http->setContent($data_tmp1);
$results = $http->exec();
echo $results;

  1.  

会得到这样一个东西:

{
"access_token" : "",
"token_type" : "Bearer",
"expires_in" : 3600,
"refresh_token" : ""
}

注意:这个refresh_token只会返回一次,后面不会在有,一定要好好保存。

这一步也需要翻墙的,如果在linux上可直接用

  1. curl -d "grant_type=authorization_code&code=4/AA96BteP0IlQj4DW48_2Uw8nVCyAWXswO1FvLftI09q1aomYPaxEo5urHY_Ij9VxKDoNh8rs6cIS8&client_id=5781114-v6f89h1jdlfnsou0ic53m5tie.apps.gooleusercontent.com&client_secret=wKsknqxSxwLPEBvirF&redirect_uri=https://test1fffff.firebaseapp.com" "https://accounts.google.com/o/oauth2/token"

6、最后就可以开始写验证脚本了

  1. public function JpGooglePay(){
  2. $google_public_key = "你的公钥(google后台在你的应用下获取)";
  3. $inapp_purchase_data = $_REQUEST['signtureTemp'];
  4. $inapp_data_signature = $_REQUEST['signtureDataTemp'];
  5. $key = "-----BEGIN PUBLIC KEY-----\n".chunk_split($google_public_key, 64,"\n").'-----END PUBLIC KEY-----';
  6. $key = openssl_pkey_get_public($key);
  7. $signature = base64_decode($inapp_data_signature);
  8. $ok = openssl_verify($inapp_purchase_data,$signature,$key,OPENSSL_ALGO_SHA1);
  9. if (1 == $ok) {
  10. // 支付验证成功!
  11. //进行二次验证,订单查询
  12.  
  13. // 1.获取access_token(3600秒有效期)
  14. $access_token_url = "https://accounts.google.com/o/oauth2/token";
  15. $data_tmp2 = array(
  16. 'grant_type'=>'refresh_token',
  17. 'refresh_token'=>'',//长效token
  18. 'client_id'=>'', //客户端id
  19. 'client_secret'=>'',//客户端密钥
  20. );
  21. $http = new http($access_token_url,'POST',5);
  22. $http->setContent($data_tmp2);
  23. $result = $http->exec();
  24. $result = json_decode($contents,true);
  25. $access_token = $result['access_token'];
  26. //2.通过获得access_token 就可以请求谷歌的API接口,获得订单状态
  27. $packageName=""//包名
  28. $productId="" //产品Id
  29. $purchaseToken=""
  30. $url = "https://www.googleapis.com/androidpublisher/v2/applications/{$packageName}/purchases/products/{$productId}/tokens/{$purchaseToken}?access_token={$access_token}";
  31. $http = new http($url,'GET',5);
  32. $http->setContent($data);
  33. $contents = $http->exec();
  34. $contents = json_decode($contents,true);
  35. if($contents['consumptionState'] == 0 && $contents['purchaseState'] == 0){
  36. //验证成功 购买成功并且没有消耗 google支付中客户端如果没有进行消耗是不能再次购买该商品
  37. //处理游戏逻辑 发钻石,通知客户端进行消耗
  38. }else{
  39. //订单验证失败
  40. }
  41. }else{
  42. //签名验证失败
  43.  
  44. }
  45. }

谷歌支付服务端详细讲解(PHP)的更多相关文章

  1. 支付宝app支付服务端流程

    支付宝APP支付服务端详解 前面接了微信支付,相比微信支付,支付宝APP支付提供了支付封装类,下面将实现支付宝APP支付.订单查询.支付结果异步通知.APP支付申请参数说明,以及服务端返回APP端发起 ...

  2. ORACLE服务端详细安装步骤(配图解)

    ORACLE服务端的安装及配置 l 将下载的安装包解压缩,双击[setup.exe]文件,系统检查监听参数,耐心等待,完成后出现如下界面,电子邮件可不填,"我希望..."建议不勾选 ...

  3. 支付宝(移动支付)服务端java版

    所需支付宝jar包: sdk2-2.0.jar(点击下载) 工具类目录结构:   点击下载 商户信息已经公钥私钥的配置(公钥私钥的生成与支付宝商户平台配置请看官方文档:https://doc.open ...

  4. TCP客户端 服务端详细代码

    本文章转自http://www.myexception.cn/program/1912019.html TCP网络编程中connect().listen()和accept()三者之间的关系 基于 TC ...

  5. 微信APP支付服务端开发Java版(一)

    一.准备工作 去微信开发者中心下载(扫码支付,里面的大部分代码是可以用的) https://pay.weixin.qq.com/wiki/doc/api/micropay.php?chapter=11 ...

  6. app集成微信支付服务端代码-php版本

    1.微信支付分为两种,一种是微信公众品台的微信支付,另一种是微信开放平台的微信支付 2.上周做的是开放品台的微信支付,把遇到的问题总结一下 第一,下载官方提供的代码,解压后放到根目录下,然后认真读文档 ...

  7. Centos7 安装zabbix3.0 服务端 详细

    参考: https://www.cnblogs.com/37yan/p/6879218.html http://blog.csdn.net/hao134838/article/details/5712 ...

  8. 支付宝H5、APP支付服务端的区别(php)

    php支付宝H5和APP支付1.准备工作需要前往 蚂蚁金服开放平台申请https://openhome.alipay.com/developmentDocument.htm 2.大致流程1.用户添加商 ...

  9. java ali支付服务端对接

    引入SDK: <!-- https://mvnrepository.com/artifact/com.aliyun/aliyun-java-sdk-core --><dependen ...

随机推荐

  1. Java-集合条件筛选

    import java.lang.reflect.Field; import java.lang.reflect.Modifier; import java.util.ArrayList; impor ...

  2. Java-随机数工具类

    import java.util.Random; import java.util.concurrent.ThreadLocalRandom; import org.apache.commons.la ...

  3. telnet客户端模拟浏览器发送请求

    telnet 客户端 telnet客户端能够发出请求去连接服务器(模拟浏览器) 使用telnet之前,需要开启telnet客户端 1.进入控制面板 2.进入程序和功能,选择打开或关闭windows功能 ...

  4. STREAMING #5 题解 3.高位网络

    高维网络 [题目描述] 现在有一个 d 维的坐标网格,其中第 i 维坐标的范围是[0,a_i].在这个范围内建立一个有向图:我们把范围内的每个整点(每一维坐标均为整数的点)当做图上的顶点.设点 A(0 ...

  5. mybatis思维导图(一)

    写在前面 与hibernate相比,我无疑更喜欢mybatis,就因为我觉得它真的好用,哈哈.它简单上手和掌握:sql语句和代码分开,方便统一管理和优化:当然缺点也有:sql工作量很大,尤其是字段多. ...

  6. SVM之SMO算法(转)

    支持向量机(Support Vector Machine)-----SVM之SMO算法(转) 此文转自两篇博文 有修改 序列最小优化算法(英语:Sequential minimal optimizat ...

  7. JS中立即执行函数的理解

    1.匿名函数不能单独定义,必须进行赋值操作或者立即执行,否则会被JS引擎定义为语法错误 function(){alert(dada);} VM229:1 Uncaught SyntaxError: U ...

  8. C/C++语言中的函数参数传参三种对比

    学了很长时间C/C++有时指针方面还是有点乱. 希望大神发现如果下面有不对的地方请指出.我发现之所以我乱就是因为中文表述不准确的问题,比如 ,地址值和地址 #include <iostream& ...

  9. SQL的Join语法

    对于SQL的Join,在学习起来可能是比较乱的.我们知道,SQL的Join语法有很多inner的,有outer的,有left的,有时候,对于Select出来的结果集是什么样子有点不是很清楚.Codin ...

  10. Generated by NetworkManager、ubuntu DNS设置丢失(network-manager造成的情况)

    方法一:去掉重启 方法二:卸载network-manager 实测网络不稳,经常掉线(kalinux2.0环境)