GVKun编程网logo

Android集成微信支付功能(android实现微信支付)

23

本文将带您了解关于Android集成微信支付功能的新内容,同时我们还将为您解释android实现微信支付的相关知识,另外,我们还将为您提供关于androidapp(个人应用)怎么集成支付宝支付功能、a

本文将带您了解关于Android集成微信支付功能的新内容,同时我们还将为您解释android实现微信支付的相关知识,另外,我们还将为您提供关于android app(个人应用)怎么集成支付宝支付功能、android 微信支付、Android 微信支付开发流程、Android 微信支付无法调用微信客户端的实用信息。

本文目录一览:

Android集成微信支付功能(android实现微信支付)

Android集成微信支付功能(android实现微信支付)

准备工作这里就不说了,包括签约和申请APPID,附上微信开放平台APP开发步骤,不懂的同学可以参考这里:

https://pay.weixin.qq.com/wiki/doc/api/app/app.php?chapter=8_5

上面的步骤很详细,这里主要说下调起支付的注意事项。按照上面文档中说的商户服务器生成支付订单,先调用统一下单API生成预付单,获取到prepay_id后将参数再次签名传输给APP发起支付。

相关代码如下: 

/** 
   * 商户服务器生成支付订单,先调用统一下单API(详见第7节)生成预付单,获取到prepay_id后将参数再次签名传输给APP发起支付。 
   */ 
  //商品描述 
  String body = "iphone6s"; 
  //随机字符串 
  String nonce_str = ResourceUtil.createrandomString(32); 
  //通知地址 
  String notify_url = "http://www.weixin.qq.com/wxpay/pay.PHP"; 
  //商户订单号 
  String out_Trade_no = ResourceUtil.generateOutTradeNo(32); 
  //总金额(单位分) 
  int total_fee = 1; 
   
  String url = "https://api.mch.weixin.qq.com/pay/unifiedorder"; 
   
  String sign = SignUtil.signByMD5("appid=" + Constants.APP_ID + "&body=" + body + 
    "&mch_id=" + Constants.MCH_ID + "&nonce_str=" + nonce_str + "¬ify_url=" + notify_url + 
     "&out_Trade_no=" + out_Trade_no + "&spbill_create_ip=127.0.0.1" + 
    "&total_fee=" + total_fee + "&Trade_type=APP" + "&key=" + Constants.KEY).toupperCase(Locale.getDefault()); 
   
  //参数以xml格式传递 
  String entity = "<xml><appid>" + Constants.APP_ID + "</appid><mch_id>" + Constants.MCH_ID + "</mch_id><nonce_str>" + nonce_str +"</nonce_str><sign>" + sign + 
    "</sign><body>" + body + "</body><out_Trade_no>" + out_Trade_no + "</out_Trade_no><total_fee>" + total_fee + 
    "</total_fee><spbill_create_ip>127.0.0.1</spbill_create_ip><notify_url>http://www.weixin.qq.com/wxpay/pay.PHP</notify_url><Trade_type>APP</Trade_type></xml>";  
   
  Log.d("entity",entity); 
  payButton.setEnabled(false); 
  Toast.makeText(PayActivity.this,"获取订单中...",Toast.LENGTH_SHORT).show(); 
   
  byte[] buf = Util.httpPost(url,entity); 
  if (buf != null && buf.length > 0) { 
   String content = new String(buf); 
   Log.d("get server pay params:",content); 
    
   OrderResult orderResult = ResourceUtil.parseXml(new ByteArrayInputStream(content.getBytes())); 
   
   if (!TextUtils.equals(orderResult.getReturnCode(),"SUCCESS")) { 
    Toast.makeText(PayActivity.this,orderResult.getReturnMsg(),Toast.LENGTH_SHORT).show(); 
    return; 
   } 
    
   if (!TextUtils.equals(orderResult.getResultCode(),orderResult.getErrorDesc(),Toast.LENGTH_SHORT).show(); 
    return; 
   } 
    
   //下单成功,调起支付 
   PayReq request = new PayReq(); 
   request.appId = Constants.APP_ID; 
   request.partnerId = Constants.MCH_ID; 
   request.prepayId = orderResult.getPrepayId(); 
   request.packageValue = "Sign=WXPay"; 
   request.nonceStr = nonce_str; 
    
   String timeStamp = String.valueOf(System.currentTimeMillis() / 1000); 
   request.timeStamp = timeStamp; 
   request.sign = SignUtil.signByMD5("appid=" + Constants.APP_ID + "&noncestr=" + nonce_str + "&package=Sign=WXPay" + 
     "&partnerid=" + Constants.MCH_ID + "&prepayid=" + orderResult.getPrepayId() + "×tamp=" + timeStamp + "&key=" + Constants.KEY).toupperCase(Locale.getDefault()); 
    
   api.sendReq(request); 
    
   payButton.setEnabled(true); 
  } 
 } 
}); 

相关参数说明在文档上都注明了,我这里面nonce_str和out_Trade_no都是我随机生成的字符创,附上我的工具类,方便大家参考。

ResourceUtil.java

package com.xylpay.sdk.pay.uikit; 
 
import java.io.IOException; 
import java.io.InputStream; 
import java.util.Random; 
 
import org.xmlpull.v1.XmlPullParser; 
import org.xmlpull.v1.XmlPullParserException; 
 
import com.xylpay.sdk.pay.bean.OrderResult; 
 
import android.util.Xml; 
 
public class ResourceUtil { 
  
 /** 
  * 随机生成字符串 
  * @param length 字符串的长度 
  * @return  随机字符串 
  */ 
 public static String createrandomString(int length) { 
  String source = "0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMnopQRSTUVWXYZ"; 
  Random random = new Random(); 
  StringBuilder builder = new StringBuilder(); 
  for (int i = 0; i < length; i++) { 
   int position = random.nextInt(source.length()); 
   builder.append(source.charat(position)); 
  } 
 
  return builder.toString(); 
 } 
  
 public static String generateOutTradeNo(int n) { 
  StringBuilder builder = new StringBuilder(); 
  Random random = new Random(); 
  for (int i = 0; i < n; i++) { 
   builder.append(random.nextInt(10)); 
  } 
 
  return builder.toString(); 
 } 
  
 public static OrderResult parseXml(InputStream is) { 
  //PULL解析xml数据 
  XmlPullParser parser = Xml.newPullParser(); 
  OrderResult orderResult = null; 
  try { 
   parser.setInput(is,"UTF-8"); 
   int type = parser.getEventType(); 
   while(type != XmlPullParser.END_DOCUMENT) { 
    switch (type) { 
    case XmlPullParser.START_DOCUMENT: 
     break; 
    case XmlPullParser.START_TAG: 
     if (parser.getName().equals("xml")) { 
      orderResult = new OrderResult(); 
     } else if (parser.getName().equals("return_code")) { 
      orderResult.setReturnCode(parser.nextText()); 
     } else if (parser.getName().equals("return_msg")) { 
      orderResult.setReturnMsg(parser.nextText()); 
     } else if (parser.getName().equals("result_code")) { 
      orderResult.setResultCode(parser.nextText()); 
     } else if (parser.getName().equals("err_code_des")) { 
      orderResult.setErrorDesc(parser.nextText()); 
     } else if (parser.getName().equals("prepay_id")) { 
      orderResult.setPrepayId(parser.nextText()); 
     } 
     break; 
    case XmlPullParser.END_TAG: 
     break; 
    } 
     
    type = parser.next(); 
   } 
  } catch(XmlPullParserException e) { 
   e.printstacktrace(); 
  } catch (IOException e) { 
   e.printstacktrace(); 
  } 
   
  return orderResult; 
 } 
} 

其中关于sign的生成,参数的顺序一定要严格按照上面的顺序加上key进行MD5加密,查看签名规范。
关于key的说明,这里的key是需要自己生成然后配置到微信开放平台的,参考商户支付密钥key的生成与设置进行配置,两边需要保持一致。另外,下单时,参数要以xml的格式来传递。

最后附上自己的签名算法:

SignUtil.java

package com.xylpay.sdk.pay.uikit; 
 
import java.security.MessageDigest; 
import java.security.NoSuchAlgorithmException; 
 
/** 
 * Created by Jackie on 2016/2/15. 
 * * MD5加密 
 */ 
public class SignUtil { 
 public static String signByMD5(String source) { 
  byte[] bytes = null; 
  try { 
   MessageDigest digest = MessageDigest.getInstance("MD5"); 
   digest.update(source.getBytes()); //更新摘要 
 
   bytes = digest.digest(); //再通过执行诸如填充之类的最终操作完成哈希计算。在调用此方法之后,摘要被重置。 
  } catch (NoSuchAlgorithmException e) { 
   e.printstacktrace(); 
  } 
 
  StringBuilder builder = new StringBuilder(bytes.length * 2); 
  for (byte b : bytes) { 
   /** 
    * 0xFF默认是整形,一个byte跟0xFF相与会先将那个byte转化成整形运算 
    */ 
   if ((b & 0xFF) < 0x10) { //如果为1位 前面补个0 
    builder.append("0"); 
   } 
 
   builder.append(Integer.toHexString(b & 0xFF)); 
  } 
 
  return builder.toString(); 
 } 
} 

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持编程小技巧。

android app(个人应用)怎么集成支付宝支付功能

android app(个人应用)怎么集成支付宝支付功能

我想做一个android app集成支付宝支付功能的demo。

把官方demo下载下来导入到eclipse,然后修改PartnerConfig里的配置信息,再运行在手机上面,提示“订单签名错误,请检查partner对应的密钥是否正确”。

我在支付宝无线商户平台咨询在线小二得到的回复是个人app无法集成支付宝的无线产品功能

不知道是不是这样?

那个人app能使用支付宝那块功能呢?小二那边回复也是使用不了  - - 汗汗汗

android 微信支付

android 微信支付

OSC 请你来轰趴啦!1028 苏州源创会,一起寻宝 AI 时代

谁有 android 微信支付的 demo         =。=  求加 Q   840307696

Android 微信支付开发流程

Android 微信支付开发流程

首先奉上调起支付页面截图

002.png

一:介绍

项目中要用到支付功能,需要支付宝支付、微信支付、银联支付,所以打算总结一下,方便以后的查阅,也方便大家, 用到的地方避免再次被坑。 今天我们就主要介绍一下微信支付,其他支付也写了对应教程,并且给出了连接。

集成前首先要看看文档,微信支付开发文档里面有详细的字段和说明。 微信支付是需要签名的,跟支付宝一样,可以在客户端签名,也可以在后台签名(当然,为了安全还是推荐在服务器上做签名,逻辑也比较好理解)

二:业务流程

以下是交互时序图,统一下单API、支付结果通知API和查询订单API等都涉及签名过程,调用都必须在商户服务器端完成。

交互时序图

商户系统和微信支付系统主要交互说明:

    1. 用户在商户APP中选择商品,提交订单,选择微信支付。
    1. 商户后台收到用户支付单,调用微信支付统一下单接口。
    1. 统一下单接口返回正常的prepay_id,再按签名规范重新生成签名后,将数据传输给APP。参与签名的字段名为appid,partnerid,prepayid,noncestr,timestamp,package。
    1. 商户APP调起微信支付。
    1. 商户后台接收支付通知。
    1. 商户后台查询支付结果。

三:下载微信SDK

微信开放平台下载SDK 建议把Android头文件和支付示例都下载下来

下载微信SDK

四:后台设置

商户在微信开放平台申请开发应用后,微信开放平台会生成APP的唯一标识APPID。由于需要保证支付安全,需要在开放平台绑定商户应用包名和应用签名,设置好后才能正常发起支付。设置界面在【开放平台】中的栏目【管理中心 / 修改应用 / 修改开发信息】里面。如下图:

102.png

应用包名:是在APP项目配置文件AndroidManifest.xml中声明的package值,例如DEMO中的。

package="net.sourceforge.simcpux"

应用签名:根据项目的应用包名和编译使用的keystore,可由签名工具生成一个32位的md5串,在调试的手机上安装签名工具后,运行可生成应用签名串,如下图所示,绿色串即应用签名。

签名工具下载地址

https://open.weixin.qq.com/zh_CN/htmledition/res/dev/download/sdk/Gen_Signature_Android.apk

103.png

net.sourceforge.simcpux 是项目包名

五:导入开发SDK

导入sdk流程同支付宝导入流程一样,这里就借用支付宝导入流程进行介绍。

5.1 如果项目开发使用的Eclipse软件,导入步骤如下:

1.将alipaySDK-20150602.jar包放入商户应用工程的libs目录下,如下图。

201.png

[图片上传中...(104.png-ea4547-1510284076514-0)]

2.进入商户应用工程的Java Build Path,将libs目录下的alipaySDK-20150602.jar导入,如下图。

202.png

3.选中Order and Export,勾选alipaySDK-20150602.jar,如下图。

203.png

将上图的支付宝sdk更换成微信sdk即可

5.2 如果项目开发使用的Android Studio软件,导入步骤如下:

1.将微信SDK拷贝到项目libs文件夹下,如果没有libs文件夹,就新建一个。

301.png

2.如果sdk使用过程中,提示找不到文件。 进行如下操作,选中sdk文件,右击选择Reveal in Finder

302.png

六:修改AndroidManifest.xml配置

1.在商户应用工程的AndroidManifest.xml文件里面添加声明:

&lt;!--微信--&gt;
<activity android:name=".wxapi.WXPayEntryActivity" android:exported="true" android:launchMode="singleTop">
</activity>

和权限声明:

&lt;!--微信--&gt;
<uses android:name="android.permission.INTERNET">

到这里,微信支付的前期配置已经完成,下面需要完成支付代码编写。

七:支付接口调用

  1. 在点击支付按钮的点击事件中,我提供的是从后端获取订单字符串,然后调用支付宝接口,调起支付。
  2. 需要在新线程中调用支付接口。代码如下:
//    支付按钮
    public void onClick(View view) {
        //起一个线程
        Runnable payRunnable = new Runnable() {
            @Override
            public void run() {
                String data = null;
                PayBean payBean = new PayBean();
                payBean.setOrderTime("");
                String json = new Gson().toJson(payBean);
                //json为获取后端结果时需要提供给后端订单信息,例如:时间、金额、订单属性等
                Log.i("charge request", json);
                try {
                    //data为后端返回数据,其中包括订单字符串
                    data = postJson(CHARGE_URL, json);
                } catch (IOException e) {
                    e.printStackTrace();
                }
                // Json解析data
                ChargeWXBean charge = new Gson().fromJson(data.replace("package", "packages"), ChargeWXBean.class);
                //在mHandler中处理微信调起支付和返回结果回调
                Message msg = new Message();
                msg.what = SDK_PAY_WECHAT;
                msg.obj = charge;
                mHandler.sendMessage(msg);
            }
        };
        // 必须异步调用
        Thread payThread = new Thread(payRunnable);
        payThread.start();
    }
  1. 在mHandler中处理调起支付
private Handler mHandler = new Handler() {

        public void handleMessage(Message msg) {
            if (msg.what == SDK_PAY_WECHAT) {

                ChargeWXBean charge =  (ChargeWXBean) msg.obj;
                String packsges = charge.getResult().getCredential().getPackages();
                String appid = charge.getResult().getCredential().getAppid();
                String partenerid = charge.getResult().getCredential().getPartnerid();
                String prepayid = charge.getResult().getCredential().getPrepayid();
                String noncestr = charge.getResult().getCredential().getNoncestr();
                String timestamp = charge.getResult().getCredential().getTimestamp();
                String sign = charge.getResult().getCredential().getSign();
//              商户APP工程中引入微信JAR包,调用API前,需要先向微信注册您的APPID,代码如下:
                final IWXAPI msgApi = WXAPIFactory.createWXAPI(ThirdActivity.this, null);
               // 将该app注册到微信   
                msgApi.registerApp(appid);

                PayReq req = new PayReq();
                req.appId = appid;
                req.partnerId = partenerid;
                req.prepayId = prepayid;
                req.nonceStr = noncestr;
                req.timeStamp = timestamp;
                req.packageValue = packsges;
                req.sign = sign;
                msgApi.sendReq(req);

            }
        }
    };
  1. 支付结果回调

参照微信SDK Sample,在net.sourceforge.simcpux.wxapi包路径中实现WXPayEntryActivity类(包名或类名不一致会造成无法回调),在WXPayEntryActivity类中实现onResp函数,支付完成后,微信APP会返回到商户APP并回调onResp函数,开发者需要在该函数中接收通知,判断返回错误码,如果支付成功则去后台查询支付结果再展示用户实际支付结果。注意一定不能以客户端返回作为用户支付的结果,应以服务器端的接收的支付通知或查询API返回的结果为准。(net.sourceforge.simcpux为你的项目包名)代码示例如下:

    @Override
    public void onResp(BaseResp resp) {
        Log.d(TAG,"onPayFinish,errCode="+resp.errCode);

        // 判断resultStatus 为“0”则代表支付成功,具体状态码代表含义可参考接口文档
        if (resp.errCode.equals("0")) {
            Toast.makeText(ThirdActivity.this, "支付成功", Toast.LENGTH_SHORT).show();
        }else if (resp.errCode.equals("-1")){

            // -1为支付失败,包括用户主动取消支付,或者系统返回的错误
            Toast.makeText(ThirdActivity.this, "支付失败", Toast.LENGTH_SHORT).show();

        }else if (resp.errCode.equals("-2")){

            // -2为取消支付,或者系统返回的错误
            Toast.makeText(ThirdActivity.this, "取消支付", Toast.LENGTH_SHORT).show();

        }else {
            // 其他为系统返回的错误
            Toast.makeText(ThirdActivity.this, "支付错误", Toast.LENGTH_SHORT).show();

        }

    }

以下三种为常用结果判断

0为支付成功 -1为支付失败 -2为取消支付

希望可以帮助大家 如果哪里有什么不对或者不足的地方,还望读者多多提意见或建议 Android技术交流群:591625129

公众号

Android 微信支付无法调用微信客户端

Android 微信支付无法调用微信客户端

项目中在开发 Android 原生 App 微信支付,在微信开放平台注册了 App 并认证,开通了微信支付。

参照官方文档开发,https://pay.weixin.qq.com/wiki/doc/api/app/app.php?chapter=9_1

1、服务端(Java)实现了统一下单 API

2、客户端(Android)调起支付API始终失败

关键代码:

A -- Java

A -- 服务端实现

 

B -- Android 

C -- Android

4 -- Android 错误信息

 

注:

AppID、AppSecret、商户支付 mchid、mchkey 均已设置过,

微信开放平台里的 App 签名已设置过了(Debug、Release都试了),

始终报图4的错误,点击支付没有任何反应。官方的 Demo 报错,无法运行。

请开发过 Android 微信支付的朋友看看,还有哪里忽略了?

今天关于Android集成微信支付功能android实现微信支付的讲解已经结束,谢谢您的阅读,如果想了解更多关于android app(个人应用)怎么集成支付宝支付功能、android 微信支付、Android 微信支付开发流程、Android 微信支付无法调用微信客户端的相关知识,请在本站搜索。

本文标签: