Coder Social home page Coder Social logo

pingpp-java's Introduction

Ping++ Java SDK

简介

  1. docs 目录下为 Ping++ Java SDK 的使用文档。
  2. example 目录下面为一个 Eclipse IDE 的示例工程。
  3. libs 为 Ping++ Java SDK 的 jar 包和 Ping++ Java SDK 所依赖的Gson 包。
  4. src 为 Ping++ Java SDK 的源代码,可以关联到 pingpp-java-x.x.x.jar 文件。或者直接把源代码引入到工程之中。

版本要求

Java 要求 JDK 8 及以上。

安装

手动安装

JAR 下载地址: pingpp-java

请根据版本号下载相应的 JAR 文件并导入至工程。

依赖库

  • com.google.code.gson:gson
  • commons-codec:commons-codec

maven 安装

maven 远程仓库

mavenCentral

安装 Ping++ SDK

<dependency>
    <groupId>com.pingxx</groupId>
    <artifactId>pingpp-java</artifactId>
    <version>2.4.1</version>
    <type>jar</type>
</dependency>

gradle 安装

gradle 远程仓库

repositories {
    mavenCentral()
}

安装 Ping++ SDK

implementation 'com.pingxx:pingpp-java:2.4.1'

初始化

Pingpp.apiKey = "YOUR_API_KEY";

使用示例

  • 参考 example 示例项目工程。该工程提供了付款、退款、微信公共号付款相关的 demo。
  • 以及 test 目录下的示例。
  • 原有旧版本的用户请查看升级文档进行相应调整。

pingpp-java's People

Contributors

afonio avatar bix29 avatar burulangtu avatar chengzhi avatar dong11 avatar gitbutler-client avatar jiacheo avatar juntin avatar samurai00 avatar takato3000 avatar yinheli avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

pingpp-java's Issues

when using gson 1.7.1.jar there has an exception,but i have to use this version.

com.google.gson.JsonParseException: Type information is unavailable, and the target object is not a primitive: {xxxxx"}
at com.google.gson.JsonObjectDeserializationVisitor.visitPrimitive(JsonObjectDeserializationVisitor.java:130) at com.google.gson.ObjectNavigator.accept(ObjectNavigator.java:116)
at com.google.gson.JsonDeserializationContextDefault.fromJsonObject(JsonDeserializationContextDefault.java:76)
at com.google.gson.JsonDeserializationContextDefault.deserialize(JsonDeserializationContextDefault.java:54)
at com.google.gson.MapTypeAdapter.deserialize(MapTypeAdapter.java:68)
at com.google.gson.MapTypeAdapter.deserialize(MapTypeAdapter.java:33)
at com.google.gson.JsonDeserializerExceptionWrapper.deserialize(JsonDeserializerExceptionWrapper.java:51)
at com.google.gson.JsonDeserializationVisitor.invokeCustomDeserializer(JsonDeserializationVisitor.java:92)
at com.google.gson.JsonObjectDeserializationVisitor.visitFieldUsingCustomHandler(JsonObjectDeserializationVisitor.java:117)
at com.google.gson.ReflectingFieldNavigator.visitFieldsReflectively(ReflectingFieldNavigator.java:63)
at com.google.gson.ObjectNavigator.accept(ObjectNavigator.java:120)
at com.google.gson.JsonDeserializationContextDefault.fromJsonObject(JsonDeserializationContextDefault.java:76)
at com.google.gson.JsonDeserializationContextDefault.deserialize(JsonDeserializationContextDefault.java:54)
at com.google.gson.Gson.fromJson(Gson.java:551)
at com.google.gson.Gson.fromJson(Gson.java:521)
at com.pingplusplus.net.ChargeDeserializer.deserialize(ChargeDeserializer.java:48)
at com.pingplusplus.net.ChargeDeserializer.deserialize(ChargeDeserializer.java:20)
at com.google.gson.JsonDeserializerExceptionWrapper.deserialize(JsonDeserializerExceptionWrapper.java:51)
at com.google.gson.JsonDeserializationVisitor.invokeCustomDeserializer(JsonDeserializationVisitor.java:92)
at com.google.gson.JsonDeserializationVisitor.visitUsingCustomHandler(JsonDeserializationVisitor.java:80)
at com.google.gson.ObjectNavigator.accept(ObjectNavigator.java:101)
at com.google.gson.JsonDeserializationContextDefault.fromJsonObject(JsonDeserializationContextDefault.java:76)
at com.google.gson.JsonDeserializationContextDefault.deserialize(JsonDeserializationContextDefault.java:54)
at com.google.gson.Gson.fromJson(Gson.java:551)
at com.google.gson.Gson.fromJson(Gson.java:498)
at com.google.gson.Gson.fromJson(Gson.java:467)
at com.google.gson.Gson.fromJson(Gson.java:417)
at com.google.gson.Gson.fromJson(Gson.java:389)
at com.pingplusplus.net.APIResource.request(APIResource.java:518)
at com.pingplusplus.model.Charge.create(Charge.java:274)
at cxj.manage.action.tradeEpay.PingPPChargeServ.charge(PingPPChargeServ.java:56)
at cxj.manage.action.tradeEpay.TradeEpayController.ePayPre(TradeEpayController.java:75)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:606)
at org.springframework.web.bind.annotation.support.HandlerMethodInvoker.doInvokeMethod(HandlerMethodInvoker.java:710)
at org.springframework.web.bind.annotation.support.HandlerMethodInvoker.invokeHandlerMethod(HandlerMethodInvoker.java:167)
at org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerAdapter.invokeHandlerMethod(AnnotationMethodHandlerAdapter.java:414)
at org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerAdapter.handle(AnnotationMethodHandlerAdapter.java:402)
at org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:771)
at org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:716)
at cxj.manage.utils.BaseDispatcherServlet.doService(BaseDispatcherServlet.java:32)
at org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:647)
at org.springframework.web.servlet.FrameworkServlet.doPost(FrameworkServlet.java:563)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:641)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:722)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:304)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:210)
at org.springframework.web.filter.CharacterEncodingFilter.doFilterInternal(CharacterEncodingFilter.java:88)
at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:76)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:243)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:210)
at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:240)
at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:164)
at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:462)
at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:164)
at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:100)
at org.apache.catalina.valves.AccessLogValve.invoke(AccessLogValve.java:562)
at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:118)
at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:395)
at org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:250)
at org.apache.coyote.http11.Http11Protocol$Http11ConnectionHandler.process(Http11Protocol.java:188)
at org.apache.tomcat.util.net.JIoEndpoint$SocketProcessor.run(JIoEndpoint.java:302)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1145)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:615)
at java.lang.Thread.run(Thread.java:744)

jcenter 替换aliyun镜像源

buildscript {
    repositories {
        maven {
            url 'https://maven.aliyun.com/repository/central'
        }
        mavenLocal()
        mavenCentral()
    }
}

allprojects {
    repositories {
        maven {
            url 'https://maven.aliyun.com/repository/central'
        }
        mavenLocal()
        mavenCentral()
    }
    apply plugin: 'maven'
    apply plugin: 'maven-publish'
    apply plugin: 'java'
}

sourceCompatibility = 1.8
targetCompatibility = 1.8

dependencies {
    compile 'com.google.code.gson:gson:2.8.5'
    compile 'commons-codec:commons-codec:1.10'

    testCompile 'junit:junit:4.12'
}

task sourcesJar(type: Jar, dependsOn: classes) {
    classifier = 'sources'
    from sourceSets.main.allSource
}

task javadocJar(type: Jar, dependsOn: javadoc) {
    classifier = 'javadoc'
    from javadoc.destinationDir
}

artifacts {
    archives sourcesJar, javadocJar
}

publishing {
    publications {
        mavenJava(MavenPublication) {
            from components.java
            artifact sourcesJar
            artifact javadocJar
            groupId 'Pingplusplus'
            artifactId 'pingpp-java'

            pom.withXml {
                def root = asNode()
                root.appendNode('name', 'pingpp-java')
                root.appendNode('url', 'https://github.com/PingPlusPlus/pingpp-java')
            }
        }
    }
}
model {
    tasks.generatePomFileForMavenJavaPublication {
        destination = file("pom.xml")
    }
}

jdk的版本问题

请问一下你们的java的jdk的版本支持多少?

我本机的jdk是1.6.02,运行你们的demo就出下面的版本不对的错误信息。
java.lang.UnsupportedClassVersionError: example/WxPubOAuthExample : Unsupported major.minor version 51.0 at java.lang.ClassLoader.defineClass1(Native Method) at java.lang.ClassLoader.defineClass(ClassLoader.java:620) at java.security.SecureClassLoader.defineClass(SecureClassLoader.java:124) at java.net.URLClassLoader.defineClass(URLClassLoader.java:260) at java.net.URLClassLoader.access$000(URLClassLoader.java:56) at java.net.URLClassLoader$1.run(URLClassLoader.java:195) at java.security.AccessController.doPrivileged(Native Method) at java.net.URLClassLoader.findClass(URLClassLoader.java:188) at java.lang.ClassLoader.loadClass(ClassLoader.java:306) at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:276) at java.lang.ClassLoader.loadClass(ClassLoader.java:251) at java.lang.ClassLoader.loadClassInternal(ClassLoader.java:319) Exception in thread "main"

使用sdk创建charge出错

com.pingplusplus.exception.InvalidRequestException: 没有提供签名串,需要在 header 中加入签名串。; type: invalid_request_error

com.pingplusplus.exception.InvalidRequestException: 没有提供签名串,需要在 header 中加入签名串。; type: invalid_request_error
	at com.pingplusplus.net.APIResource.handleAPIError(APIResource.java:248)
	at com.pingplusplus.net.APIResource.request(APIResource.java:209)
	at com.pingplusplus.model.Charge.create(Charge.java:284)

创建 Refund 对象,怎么不能传商户自己的退款单号?

如果创建 Refund 对象超时,并不幂等,只能根据Charge分页查询获取最新的Refund对象,但是是部分退款,获取到了最新的Refund对象,还只能通过金额去判断大概是不是这个Refund对象。如果差不多先后时间,有其他业务操作也是创建了相同金额的Refund对象。
那么有可能就会存在误判,认为这个Refund对象是之前超时请求创建的。

本来先后有两个业务都退了5块钱,其中一个超时网络异常,实际并没有请求成功,但是查询了一次发现其他业务创建的Refund对象,则会存在误认为自己退款成功

B-----> Create Refund对象, 退款5元,创建成功。
B-----> Create Refund对象, 退款5元,创建失败,因为网络超时,实际ping++并没有收到请求,
这边流程会根据Charge对象去查询Refund对象列表,发现刚才已经创建成功了一个Refund对象 也是退款5元,因为没有其他信息只能根据金额。
不然描述description字段保存退款单号。。。

PingppObject类中GsonBuilder注册registerTypeAdapter的疑问。

public static final Gson PRETTY_PRINT_GSON = new GsonBuilder()
.setPrettyPrinting()
.serializeNulls()
.setFieldNamingPolicy(FieldNamingPolicy.LOWER_CASE_WITH_UNDERSCORES)
.disableHtmlEscaping()
.registerTypeAdapter(BatchTransferRecipientSerializer.class, new BatchTransferRecipientSerializer())
.registerTypeAdapter(BatchRefundCharges.class, new BatchRefundChargesSerializer())
.registerTypeAdapter(Double.class, new DoubleTypeSerializer())
.registerTypeAdapter(ChargeEssentials.class, new ChargeEssentialsSerializer())
.registerTypeAdapter(CouponTemplateExpiration.class, new CouponTemplateExpirationSerializer())
.registerTypeAdapter(SettleAccountRecipient.class, new SettleAccountRecipientSerializer())
.create();

这里的registerTypeAdapter(BatchTransferRecipientSerializer.class, new BatchTransferRecipientSerializer()是不是应该为: .registerTypeAdapter(BatchTransferRecipient.class, new BatchTransferRecipientSerializer())

流程接入说明吗?

您好,第一次接触这个东西,想调研一下贵公司产品,看文档有点懵,咱们这个有流程接入说明吗?或者大概怎么深入了解?

请求体解析失败: 不是一个合法的 json 格式字符串

直接复制官网给出的示例代码,使用gradle引入sdk后,Charge.create一直调试不通,给出异常信息如下:

com.pingplusplus.exception.InvalidRequestException: Error type: invalid_request_error
Error message: 请求体解析失败: 不是一个合法的 json 格式字符串

at com.pingplusplus.net.APIResource.handleAPIError(Unknown Source)
at com.pingplusplus.net.APIResource.request(Unknown Source)
at com.pingplusplus.model.Charge.create(Unknown Source)

跟踪调试发现,APIResource.createJSONString一直返回null

https://github.com/PingPlusPlus/pingpp-java/blob/master/src/main/java/com/pingplusplus/net/APIResource.java#L527

//sdk中序列化部分代码
Gson gson = new GsonBuilder().enableComplexMapKeySerialization().create();
logger.debug(gson.toJson(chargeParams)); //输出null

logger.debug(JSONUtils.toJson(chargeParams));
//输出:{"order_no":"1bo6u5e010001","app":{"id":"adfaadfasdfads"},"amount":100,"subject":"adfadf","channel":"alipay","client_ip":"127.0.0.1","currency":"cny","body":"1bo9mv9010001"}

烦请确认!
`

com.google.gson.JsonParseException: Type information is unavailable, and the target object is not a primitive

demo直接运行Main方法,一直报错,如下,第一次集成这个支付,好无力,求大神解答,
警告: Overriding the existing type handler for interface java.util.Map
Exception in thread "main" com.google.gson.JsonParseException: Type information is unavailable, and the target object is not a primitive: {"orderInfo":"_input_charset="utf-8"&body="Your Body"&it_b_pay="2016-06-03 16:31:15"&notify_url="https%3A%2F%2Fapi.pingxx.com%2Fnotify%2Fcharges%2Fch_yHS0CC4qTerDmznHWLj5WHKC"&out_trade_no="1464856241617rbrm4vv"&partner="2008536698119845"&payment_type="1"&seller_id="2008536698119845"&service="mobile.securitypay.pay"&subject="Your Subject"&total_fee="1.00"&sign="UG1EdVBTTGF2TEdLNW1UaTUweWZmYnJQ"&sign_type="RSA""}
at com.google.gson.JsonObjectDeserializationVisitor.visitPrimitive(JsonObjectDeserializationVisitor.java:130)
at com.google.gson.ObjectNavigator.accept(ObjectNavigator.java:116)
at com.google.gson.JsonDeserializationContextDefault.fromJsonObject(JsonDeserializationContextDefault.java:76)
at com.google.gson.JsonDeserializationContextDefault.deserialize(JsonDeserializationContextDefault.java:54)
at com.google.gson.MapTypeAdapter.deserialize(MapTypeAdapter.java:68)
at com.google.gson.MapTypeAdapter.deserialize(MapTypeAdapter.java:33)
Disconnected from the target VM, address: '127.0.0.1:58520', transport: 'socket'
at com.google.gson.JsonDeserializerExceptionWrapper.deserialize(JsonDeserializerExceptionWrapper.java:51)
at com.google.gson.JsonDeserializationVisitor.invokeCustomDeserializer(JsonDeserializationVisitor.java:92)
at com.google.gson.JsonObjectDeserializationVisitor.visitFieldUsingCustomHandler(JsonObjectDeserializationVisitor.java:117)
at com.google.gson.ReflectingFieldNavigator.visitFieldsReflectively(ReflectingFieldNavigator.java:63)
at com.google.gson.ObjectNavigator.accept(ObjectNavigator.java:120)
at com.google.gson.JsonDeserializationContextDefault.fromJsonObject(JsonDeserializationContextDefault.java:76)
at com.google.gson.JsonDeserializationContextDefault.deserialize(JsonDeserializationContextDefault.java:54)
at com.google.gson.Gson.fromJson(Gson.java:551)
at com.google.gson.Gson.fromJson(Gson.java:521)
at com.pingplusplus.net.ChargeDeserializer.deserialize(ChargeDeserializer.java:49)
at com.pingplusplus.net.ChargeDeserializer.deserialize(ChargeDeserializer.java:20)
at com.google.gson.JsonDeserializerExceptionWrapper.deserialize(JsonDeserializerExceptionWrapper.java:51)
at com.google.gson.JsonDeserializationVisitor.invokeCustomDeserializer(JsonDeserializationVisitor.java:92)
at com.google.gson.JsonDeserializationVisitor.visitUsingCustomHandler(JsonDeserializationVisitor.java:80)
at com.google.gson.ObjectNavigator.accept(ObjectNavigator.java:101)
at com.google.gson.JsonDeserializationContextDefault.fromJsonObject(JsonDeserializationContextDefault.java:76)
at com.google.gson.JsonDeserializationContextDefault.deserialize(JsonDeserializationContextDefault.java:54)
at com.google.gson.Gson.fromJson(Gson.java:551)
at com.google.gson.Gson.fromJson(Gson.java:498)
at com.google.gson.Gson.fromJson(Gson.java:467)
at com.google.gson.Gson.fromJson(Gson.java:417)
at com.google.gson.Gson.fromJson(Gson.java:389)
at com.pingplusplus.net.APIResource.request(APIResource.java:543)
at com.pingplusplus.model.Charge.create(Charge.java:274)
at com.pingxx.example.ChargeExample.createCharge(ChargeExample.java:71)
at com.pingxx.example.ChargeExample.runDemos(ChargeExample.java:37)
at com.pingxx.example.Main.main(Main.java:48)

支付宝H5支付,服务端创建Charge为何要填写发起请求的ip?

如题,我接过支付宝官方的wap支付,也没说还要传客户端ip啊?

另外我测试一直提示这个:
错误代码 insufficient-isv-permissions 错误原因: ISV权限不足,建议在开发者中心检查对应功能是否已经添加,解决办法详见:
https://docs.open.alipay.com/common/isverror

是我ip地址填错(我填的127.0.0.1)?我看 https://pingplusplus.kf5.com/hc/kb/article/1041961/ 这个地址说请登录支付宝检查签约产品是否已生效,关键是我是接的ping++,不是直接接支付宝啊,怎么还要我自己登支付宝去查看呢?

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.