Android集成微信支付

申请资质什么的一大堆东西请自行解决,点击去微信开放平台申请

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

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

最终我们得到的AppID,AppSecret,PartnerID。

下面是app工程接入步骤:

引入sdk。可以下载sdk或者通过Gradle依赖

  1. dependencies {  
  2.   
  3. compile ’com.tencent.mm.opensdk:wechat-sdk-android-with-mta:+’  
  4.   
  5. }  
dependencies {

compile 'com.tencent.mm.opensdk:wechat-sdk-android-with-mta:+'

}
  1. dependencies {  
  2.   
  3. compile ’com.tencent.mm.opensdk:wechat-sdk-android-without-mta:+’  
  4.   
  5. }  
dependencies {

compile 'com.tencent.mm.opensdk:wechat-sdk-android-without-mta:+'

}

参考app端接入流程Android部分,点击查看官方文档

注册AppID,将app注册到微信

  1. final IWXAPI api = WXAPIFactory.createWXAPI(context, );  
  2.   
  3.  api.registerApp(”wxd930ea5d5a258f4f”);//参数为AppID  
    final IWXAPI api = WXAPIFactory.createWXAPI(context, null);

     api.registerApp("wxd930ea5d5a258f4f");//参数为AppID

调起支付

  1. PayReq request = new PayReq();  
  2.   
  3. request.appId = ”wxd930ea5d5a258f4f”;  
  4.   
  5. request.partnerId = ”1900000109”;  
  6.   
  7. request.prepayId= ”1101000000140415649af9fc314aa427”,;  
  8.   
  9. request.packageValue = ”Sign=WXPay”;  
  10.   
  11. request.nonceStr= ”1101000000140429eb40476f8896f4c9”;  
  12.   
  13. request.timeStamp= ”1398746574”;  
  14.   
  15. request.sign= ”7FFECB600D7157C5AA49810D2D8F28BC2811827B”;  
  16.   
  17. api.sendReq(request);  
PayReq request = new PayReq();

request.appId = "wxd930ea5d5a258f4f";

request.partnerId = "1900000109";

request.prepayId= "1101000000140415649af9fc314aa427",;

request.packageValue = "Sign=WXPay";

request.nonceStr= "1101000000140429eb40476f8896f4c9";

request.timeStamp= "1398746574";

request.sign= "7FFECB600D7157C5AA49810D2D8F28BC2811827B";

api.sendReq(request);

以上参数信息请查看官方文档

支付回调

在包名中新建一个包,即{ 包名}.wxapi 。在{ 包名}.wxapi中实现类名为WXPayEntryActivity类(包名或类名不一致会造成无法回调),该类实现IWXAPIEventHandler,如下:

  1. public class WXPayEntryActivity extends AppCompatActivity implements IWXAPIEventHandler {  
  2.     private final IWXAPI api=WXAPIFactory.createWXAPI(this, URL.WX_APP_ID);  
  3.   
  4.     @Override  
  5.     protected void onNewIntent(Intent intent) {  
  6.         super.onNewIntent(intent);  
  7.         setIntent(intent);  
  8.         api.handleIntent(intent, this);  
  9.     }  
  10.   
  11.     @Override  
  12.     protected void onCreate(@Nullable Bundle savedInstanceState) {  
  13.         super.onCreate(savedInstanceState);  
  14.         api.handleIntent(getIntent(), this);  
  15.     }  
  16.     @Override  
  17.     public void onReq(BaseReq baseReq) {  
  18.         toastShort( ”openid = ” + baseReq.openId);  
  19.     }  
  20.   
  21.     @Override  
  22.     public void onResp(BaseResp baseResp) {  
  23.   
  24.         if (baseResp.errCode==0){  
  25.             //微信支付成功  
  26.             toastShort(”支付成功”);  
  27.         }else if (baseResp.errCode==-2){  
  28.             //取消支付  
  29.             toastShort(”用户取消支付”);  
  30.         }else {  
  31.             //支付出错  
  32.             toastShort(baseResp.errCode+baseResp.errStr);  
  33.         }  
  34.         finish();  
  35.     }  
  36.   
  37.     private void toastShort( String msg) {  
  38.         Toast.makeText(this,msg,Toast.LENGTH_SHORT).show();  
  39.     }  
  40. }  
public class WXPayEntryActivity extends AppCompatActivity implements IWXAPIEventHandler {
    private final IWXAPI api=WXAPIFactory.createWXAPI(this, URL.WX_APP_ID);

    @Override
    protected void onNewIntent(Intent intent) {
        super.onNewIntent(intent);
        setIntent(intent);
        api.handleIntent(intent, this);
    }

    @Override
    protected void onCreate(@Nullable Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        api.handleIntent(getIntent(), this);
    }
    @Override
    public void onReq(BaseReq baseReq) {
        toastShort( "openid = " + baseReq.openId);
    }

    @Override
    public void onResp(BaseResp baseResp) {

        if (baseResp.errCode==0){
            //微信支付成功
            toastShort("支付成功");
        }else if (baseResp.errCode==-2){
            //取消支付
            toastShort("用户取消支付");
        }else {
            //支付出错
            toastShort(baseResp.errCode+baseResp.errStr);
        }
        finish();
    }

    private void toastShort( String msg) {
        Toast.makeText(this,msg,Toast.LENGTH_SHORT).show();
    }
}

回调中errCode值列表

名称 描述 解决方案
0 成功 展示成功页面
-1 错误 可能的原因:签名错误、未注册APPID、项目设置APPID不正确、注册的APPID与设置的不匹配、其他异常等。
-2 用户取消 无需处理。发生场景:用户不支付了,点击取消,返回APP。

AndroidManifest.xml 设置

添加必要的权限支持:

  1. <uses-permission android:name=“android.permission.INTERNET”/>  
  2.   
  3. <uses-permission android:name=“android.permission.ACCESS_NETWORK_STATE”/>  
  4.   
  5. <uses-permission android:name=“android.permission.ACCESS_WIFI_STATE”/>  
  6.   
  7. <uses-permission android:name=“android.permission.READ_PHONE_STATE”/>  
  8.   
  9. <uses-permission android:name=“android.permission.WRITE_EXTERNAL_STORAGE”/>  
<uses-permission android:name="android.permission.INTERNET"/>

<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"/>

<uses-permission android:name="android.permission.ACCESS_WIFI_STATE"/>

<uses-permission android:name="android.permission.READ_PHONE_STATE"/>

<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>

回调页配置

  1. <activity  
  2.    android:name=“net.sourceforge.simcpux.wxapi.WXPayEntryActivity”  
  3.    android:exported=“true”//必须  
  4.    android:launchMode=“singleTop”/>  
<activity
   android:name="net.sourceforge.simcpux.wxapi.WXPayEntryActivity"
   android:exported="true"//必须
   android:launchMode="singleTop"/>
总结遇到的坑,签名什么的,必须配置好,还有运行的时候要keystore签名打包,有时候偷懒配置debug的keystore就是正式的keystore,偶尔会出现意想不到的错误。比如我遇到的问题,api.sendReq(request)成功却未唤醒微信app,回调返回errCode是-1;反复检查了签名什么的都没错(有的也都改了),然而就是不成功。原因不在我的app,而是微信缓存的我的app注册到它的签名问题,比如keystore发生了改变,appid刚开始不正确等。清除微信缓存可以解决问题,或者干脆卸载重装微信。
            </div>

申请资质什么的一大堆东西请自行解决,点击去微信开放平台申请

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

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

最终我们得到的AppID,AppSecret,PartnerID。

下面是app工程接入步骤:

引入sdk。可以下载sdk或者通过Gradle依赖

  1. dependencies {  
  2.   
  3. compile ’com.tencent.mm.opensdk:wechat-sdk-android-with-mta:+’  
  4.   
  5. }  
dependencies {

compile 'com.tencent.mm.opensdk:wechat-sdk-android-with-mta:+'

}
  1. dependencies {  
  2.   
  3. compile ’com.tencent.mm.opensdk:wechat-sdk-android-without-mta:+’  
  4.   
  5. }  
dependencies {

compile 'com.tencent.mm.opensdk:wechat-sdk-android-without-mta:+'

}

参考app端接入流程Android部分,点击查看官方文档

注册AppID,将app注册到微信

  1. final IWXAPI api = WXAPIFactory.createWXAPI(context, );  
  2.   
  3.  api.registerApp(”wxd930ea5d5a258f4f”);//参数为AppID  
    final IWXAPI api = WXAPIFactory.createWXAPI(context, null);

     api.registerApp("wxd930ea5d5a258f4f");//参数为AppID

调起支付

  1. PayReq request = new PayReq();  
  2.   
  3. request.appId = ”wxd930ea5d5a258f4f”;  
  4.   
  5. request.partnerId = ”1900000109”;  
  6.   
  7. request.prepayId= ”1101000000140415649af9fc314aa427”,;  
  8.   
  9. request.packageValue = ”Sign=WXPay”;  
  10.   
  11. request.nonceStr= ”1101000000140429eb40476f8896f4c9”;  
  12.   
  13. request.timeStamp= ”1398746574”;  
  14.   
  15. request.sign= ”7FFECB600D7157C5AA49810D2D8F28BC2811827B”;  
  16.   
  17. api.sendReq(request);  
PayReq request = new PayReq();

request.appId = "wxd930ea5d5a258f4f";

request.partnerId = "1900000109";

request.prepayId= "1101000000140415649af9fc314aa427",;

request.packageValue = "Sign=WXPay";

request.nonceStr= "1101000000140429eb40476f8896f4c9";

request.timeStamp= "1398746574";

request.sign= "7FFECB600D7157C5AA49810D2D8F28BC2811827B";

api.sendReq(request);

以上参数信息请查看官方文档

支付回调

在包名中新建一个包,即{ 包名}.wxapi 。在{ 包名}.wxapi中实现类名为WXPayEntryActivity类(包名或类名不一致会造成无法回调),该类实现IWXAPIEventHandler,如下:

  1. public class WXPayEntryActivity extends AppCompatActivity implements IWXAPIEventHandler {  
  2.     private final IWXAPI api=WXAPIFactory.createWXAPI(this, URL.WX_APP_ID);  
  3.   
  4.     @Override  
  5.     protected void onNewIntent(Intent intent) {  
  6.         super.onNewIntent(intent);  
  7.         setIntent(intent);  
  8.         api.handleIntent(intent, this);  
  9.     }  
  10.   
  11.     @Override  
  12.     protected void onCreate(@Nullable Bundle savedInstanceState) {  
  13.         super.onCreate(savedInstanceState);  
  14.         api.handleIntent(getIntent(), this);  
  15.     }  
  16.     @Override  
  17.     public void onReq(BaseReq baseReq) {  
  18.         toastShort( ”openid = ” + baseReq.openId);  
  19.     }  
  20.   
  21.     @Override  
  22.     public void onResp(BaseResp baseResp) {  
  23.   
  24.         if (baseResp.errCode==0){  
  25.             //微信支付成功  
  26.             toastShort(”支付成功”);  
  27.         }else if (baseResp.errCode==-2){  
  28.             //取消支付  
  29.             toastShort(”用户取消支付”);  
  30.         }else {  
  31.             //支付出错  
  32.             toastShort(baseResp.errCode+baseResp.errStr);  
  33.         }  
  34.         finish();  
  35.     }  
  36.   
  37.     private void toastShort( String msg) {  
  38.         Toast.makeText(this,msg,Toast.LENGTH_SHORT).show();  
  39.     }  
  40. }  
public class WXPayEntryActivity extends AppCompatActivity implements IWXAPIEventHandler {
    private final IWXAPI api=WXAPIFactory.createWXAPI(this, URL.WX_APP_ID);

    @Override
    protected void onNewIntent(Intent intent) {
        super.onNewIntent(intent);
        setIntent(intent);
        api.handleIntent(intent, this);
    }

    @Override
    protected void onCreate(@Nullable Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        api.handleIntent(getIntent(), this);
    }
    @Override
    public void onReq(BaseReq baseReq) {
        toastShort( "openid = " + baseReq.openId);
    }

    @Override
    public void onResp(BaseResp baseResp) {

        if (baseResp.errCode==0){
            //微信支付成功
            toastShort("支付成功");
        }else if (baseResp.errCode==-2){
            //取消支付
            toastShort("用户取消支付");
        }else {
            //支付出错
            toastShort(baseResp.errCode+baseResp.errStr);
        }
        finish();
    }

    private void toastShort( String msg) {
        Toast.makeText(this,msg,Toast.LENGTH_SHORT).show();
    }
}

回调中errCode值列表

名称 描述 解决方案
0 成功 展示成功页面
-1 错误 可能的原因:签名错误、未注册APPID、项目设置APPID不正确、注册的APPID与设置的不匹配、其他异常等。
-2 用户取消 无需处理。发生场景:用户不支付了,点击取消,返回APP。

AndroidManifest.xml 设置

添加必要的权限支持:

  1. <uses-permission android:name=“android.permission.INTERNET”/>  
  2.   
  3. <uses-permission android:name=“android.permission.ACCESS_NETWORK_STATE”/>  
  4.   
  5. <uses-permission android:name=“android.permission.ACCESS_WIFI_STATE”/>  
  6.   
  7. <uses-permission android:name=“android.permission.READ_PHONE_STATE”/>  
  8.   
  9. <uses-permission android:name=“android.permission.WRITE_EXTERNAL_STORAGE”/>  
<uses-permission android:name="android.permission.INTERNET"/>

<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"/>

<uses-permission android:name="android.permission.ACCESS_WIFI_STATE"/>

<uses-permission android:name="android.permission.READ_PHONE_STATE"/>

<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>

回调页配置

  1. <activity  
  2.    android:name=“net.sourceforge.simcpux.wxapi.WXPayEntryActivity”  
  3.    android:exported=“true”//必须  
  4.    android:launchMode=“singleTop”/>  
<activity
   android:name="net.sourceforge.simcpux.wxapi.WXPayEntryActivity"
   android:exported="true"//必须
   android:launchMode="singleTop"/>
总结遇到的坑,签名什么的,必须配置好,还有运行的时候要keystore签名打包,有时候偷懒配置debug的keystore就是正式的keystore,偶尔会出现意想不到的错误。比如我遇到的问题,api.sendReq(request)成功却未唤醒微信app,回调返回errCode是-1;反复检查了签名什么的都没错(有的也都改了),然而就是不成功。原因不在我的app,而是微信缓存的我的app注册到它的签名问题,比如keystore发生了改变,appid刚开始不正确等。清除微信缓存可以解决问题,或者干脆卸载重装微信。
            </div>

猜你喜欢

转载自blog.csdn.net/yzj_0722/article/details/80466649